DEV Community

Anoop Singh
Anoop Singh

Posted on

C++ vs. Rust: A Comparative Guide to Syntax, Variables, and Control Flow

Hello World

C++ Version:

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Rust version:

fn main() {
    println!("Hello, World!");
}
Enter fullscreen mode Exit fullscreen mode

Variables and datatypes:

C++ version:

#include <iostream>

int main() {
    int x = 5;
    double y = 3.14;
    std::cout << "x: " << x << ", y: " << y << std::endl;
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Rust version :

fn main() {
    let x: i32 = 10; // here i32 is a 32-bit integer
    let y = 22; // Rust can infer the type from given value
    let z: f32 = 30.0;
    x = x + 1; // This will throw an error because x is immutable
}
Enter fullscreen mode Exit fullscreen mode

In rust variable are immutable by default

To make them mutable

fn main() {
    let mut x= 5;
    x = x + 1;
    println!("x: {}", x);
}
Enter fullscreen mode Exit fullscreen mode

But immutable doesn’t means they are constant -

fn main() {
    let x = 5;
    let x = 10; // You can shadow the variable
    println!("x: {}", x);
}
Enter fullscreen mode Exit fullscreen mode

Why need such functionality?

fn main() {
    let s = "hello ";
    let s = s.trim(); // No need to create a new variable
    println!("s: {}", s); 
}
Enter fullscreen mode Exit fullscreen mode

Functions:

C++ version

int add(int a, int b) {
    return a + b;
}

int main() {
    std::cout << "Sum: " << add(5, 3) << std::endl;
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Rust version

fn add(a: i32, b: i32) -> i32 { // Type required
    a + b // Note - semicolon is omitted   
}

fn main() {
    println!("Sum: {}", add(5, 3));
}
Enter fullscreen mode Exit fullscreen mode

Conditionals

C++ version

int main() {
    int number = 10;

    if (number > 5) {
        std::cout << "Number is greater than 5." << std::endl;
    } else if (number == 5) {
        std::cout << "Number is equal to 5." << std::endl;
    } else {
        std::cout << "Number is less than 5." << std::endl;
    }

    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Rust version;

fn main() {
    let number = 10;

    if number > 5 {
        println!("Number is greater than 5.");
    } else if number == 5 {
        println!("Number is equal to 5.");
    } else {
        println!("Number is less than 5.");
    }
}
Enter fullscreen mode Exit fullscreen mode

Loops

C++ version

int main() {
    for (int i = 0; i < 5; ++i) {
        std::cout << "Iteration: " << i << std::endl;
    }

    int j = 0;
    while (j < 5) {
        std::cout << "While Iteration: " << j << std::endl;
        j++;
    }

    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Rust version:

int main() {
    for i in 0..5 {
        println!("Iteration: {}", i);
    }

   let mut count = 0;
    loop {
        count += 1;
        println!("{}", count);
        if count > 10 {
            break; 
        }
    }

    let mut j = 0;
    while j < 5 {
        println!("While Iteration: {}", j);
        j += 1;
    }
}
Enter fullscreen mode Exit fullscreen mode

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay