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++:从入门到工作的教程
- 这是我的第一个 C++程序!
- C++中main函数有什么作用?
- C++中 #include 指令的作用
- C++中常用的预处理指令
- C++中 iostream 头文件定义了什么
- C++名称空间(namespace)
- C++标准库中 std 命名空间定义了些什么
- C++常用的头文件
- C++源代码的发布方式
- C++变量名的定义、变量的作用、使用规范
- C++的关键字列表
- C++数据类型:整型(整数类型)
- 二进制补码、原码、反码
- C++数据类型:char字符型(整数类型)
- ASCII码表及C++字符函数库(cctype)
- 计算机汉字编码
- C++数据类型:bool类型(整数类型)
- C++中 const 限定符
- C++数据类型:浮点数
- C++运算符:算术运算符
- C++运算符:类型转换规则
- 计算机数据存储大小端模式
- C++运算符:位运算 与 bitset类库
- C++运算符:关系运算符与逻辑运算符
- C++流程控制:顺序、选择、循环、跳转语句
- C++函数的定义、参数传递、重载、嵌套
- C++数组:一维、二维、多维数组的运用
- C-style字符串、库函数 与 std::string对象
- C++数据类型:结构体(struct)
- C++数据类型:联合体(union)
- C++数据类型:枚举(enum)
- C++数据类型别名:typedef
- C++指针
- C++内存操作符:new分配 与 delete释放
- C++标准模板库(STL)容器、算法、迭代器
- C++标准模板库(STL)vector顺序容器
- C++标准模板库(STL)array固定容器
- C++标准模板库(STL)list双向链表容器
- C++标准模板库(STL)deque双端队列
- C++标准模板库(STL)集合 set 关联容器
- C++标准模板库(STL)map关联容器
- C++标准模板库(STL)unordered_set
- C++标准模板库(STL)unordered_map
- C++标准模板库(STL)algorithm算法库
- C++文件操作
- C++数学库(cmath)数学常量与数学函数
- C++模板:函数模板、类模板
- C++与SQLite3联合打造实用的应用程序
- C++实战开发中常用的库(概述)
- 第二部分:C++面向对象编程
- C++:类的定义与声明、类对象应用
- 第三部分:数据结构与算法(概述)
- 第一部分:C++语言简介与学习路线