C++流程控制:顺序、选择、循环、跳转语句

一. 顺序结构

顺序结构是最基本的流程控制结构,按照语句的书写顺序依次执行。

#include <iostream>
int main() {
    int num1 = 5;
    int num2 = 10;
    int sum = num1 + num2;
    std::cout << "The sum is: " << sum << std::endl;
    return 0;
}

在这个例子中,先定义变量num1和num2,然后计算它们的和,最后输出结果,语句按照从上到下的顺序执行。

二. 选择结构

1. 单分支if语句:根据条件判断是否执行一段代码。

#include <iostream>
int main() {
    int num = 10;
    if (num > 5) {
        std::cout << "The number is greater than 5." << std::endl;
    }
    return 0;
}

2. 双分支if - else语句:在条件为真和假时分别执行不同的代码段。

#include <iostream>
int main() {
    int num = 3;
    if (num > 5) {
        std::cout << "The number is greater than 5." << std::endl;
    } else {
        std::cout << "The number is not greater than 5." << std::endl;
    }
    return 0;
}

3. 多分支if - else if - else语句:用于处理多个不同条件的情况。

#include <iostream>
int main() {
    int num = 7;
    if (num < 5) {
        std::cout << "The number is less than 5." << std::endl;
    } else if (num < 10) {
        std::cout << "The number is between 5 and 10." << std::endl;
    } else {
        std::cout << "The number is greater than or equal to 10." << std::endl;
    }
    return 0;
}

4. switch语句

根据表达式的值跳转到不同的case分支执行相应的代码。

#include <iostream>
int main() {
    int day = 3;
    switch (day) {
        case 1:
            std::cout << "Monday" << std::endl;
            break;
        case 2:
            std::cout << "Tuesday" << std::endl;
            break;
        case 3:
            std::cout << "Wednesday" << std::endl;
            break;
        case 4:
            std::cout << "Thursday" << std::endl;
            break;
        case 5:
            std::cout << "Friday" << std::endl;
            break;
        case 6:
            std::cout << "Saturday" << std::endl;
            break;
        case 7:
            std::cout << "Sunday" << std::endl;
            break;
        default:
            std::cout << "Invalid input" << std::endl;
    }
    return 0;
}

三. 循环结构

1. while循环:当条件为真时,重复执行循环体中的代码。

#include <iostream>
int main() {
    int num = 0;
    while (num < 5) {
        std::cout << num << " ";
        num++;
    }
    std::cout << std::endl;
    return 0;
}

2. do - while循环:先执行一次循环体,然后再判断条件是否为真,如果为真则继续循环。

#include <iostream>
int main() {
    int num = 0;
    do {
        std::cout << num << " ";
        num++;
    } while (num < 5);
    std::cout << std::endl;
    return 0;
}

3. for循环:一种更紧凑的循环结构,用于指定循环的初始化、条件判断和迭代部分。

#include <iostream>
int main() {
    for (int i = 0; i < 5; i++) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

4. 基于范围的for循环(C++11及以上)用于方便地遍历数组、容器等可迭代对象。

#include <iostream>
#include <vector>
int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}

四. 跳转语句

1. break语句

用于跳出当前的switch语句或者循环(while、do - while、for循环)。例如,在循环中找到满足条件的值后跳出循环:

#include <iostream>
int main() {
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            break;
        }
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

2. continue语句

用于跳过当前循环中的剩余代码,直接进入下一次循环。

#include <iostream>
int main() {
    for (int i = 0; i < 5; i++) {
        if (i == 2) {
            continue;
        }
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

3. goto语句

可以无条件地跳转到程序中的指定标签处。不过,goto语句的使用会使程序结构变得复杂,容易出错,应谨慎使用。

#include <iostream>
int main() {
    int num = 3;
    if (num < 5) {
        goto label;
    }
    std::cout << "This line will not be printed." << std::endl;
    label:
        std::cout << "The number is less than 5." << std::endl;
    return 0;
}

五. 三元运算符 ? :

1. 定义:?:是C和C++中的条件运算符,也被称为三元运算符。它是一种简洁的表达式,用于根据条件的真假来选择两个表达式中的一个。

2. 语法:条件表达式? 表达式1 : 表达式2。其中,条件表达式是一个求值结果为布尔值(真或假)的表达式;如果条件表达式为真,则整个?:表达式的值为表达式1的值;如果条件表达式为假,则整个?:表达式的值为表达式2的值。

int a = 10, b = 20; 
int max = (a > b)? a : b;

这里的条件表达式是a > b,由于a(10)小于b(20),条件为假,所以max被赋值为表达式2的值,即b的值20。

可以嵌套使用?:运算符。

int num = 5; 
int result = (num < 0)? -1 : ((num == 0)? 0 : 1);

首先判断num是否小于0,如果是则result为 - 1;如果不是,则继续判断num是否等于0,如果等于0则result为0;如果num既不小于0也不等于0(即大于0),则result为1。

3. 与if - else语句的比较

简洁性

?:运算符的主要优点是简洁。对于简单的条件判断和赋值操作,它可以在一行代码中完成,而不需要使用if - else语句的多行代码结构。例如,上面求两个数中较大值的操作,如果使用if - else语句则为:

int a = 10, b = 20;
int max;
if (a > b) {
    max = a;
} else {
    max = b;
}

相比之下,?:运算符的表达式更加紧凑。

局限性

然而,?:运算符也有局限性。对于复杂的逻辑判断,特别是当需要执行多条语句而不仅仅是简单的表达式求值时,if - else语句更为合适。例如,如果在条件为真或假时需要执行多个语句或者进行复杂的逻辑操作(如循环、函数调用等),则不能直接使用?:运算符,而必须使用if - else语句。

4. 类型一致性要求

在使用?:运算符时,表达式1和表达式2的类型应该兼容。如果它们的类型不一致,编译器会尝试进行类型转换。例如,如果表达式1是int类型,表达式2是double类型,在计算?:表达式时,表达式1的值可能会被隐式转换为double类型(具体的转换规则遵循C和C++的类型转换规则)。但是,如果类型转换不合法,则会导致编译错误。例如:

int a = 1;
const char* s1 = "hello";
const char* s2 = "world";
const char* result = (a > 0)? s1 : s2; // 合法,返回const char*类型的值
int num = (a > 0)? s1 : s2; // 错误,不能将const char*类型转换为int类型

C++编程语言基础

C++流程控制:顺序、选择、循环、跳转语句