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类型