程序流程结构
顺序结构:顺序执行不发生跳转。
选择结构:依据条件的结构
选择结构
判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。
流程
if语句
一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
语句 | 描述 |
---|---|
if 语句 | 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 |
if...else 语句 | 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。 |
嵌套 if 语句 | 您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 |
三目运算符
作用:对于有些选择分支结构,可以使用简单的条件运算符来代替
语法:表达式1?表达式2:表达式3
语义:先执行表达式1,执行完毕,表达式1的结果如果为真,那么执行表达式2,并且这个整体的运算式的结果是表达式2的结果,否则执行表达式3,运算式的结果是表达式3的结果。
示例:c = (a>b?a:b);
在C++中三目运算符返回的是表达式,如果是变量的话,可以作为左值变量继续赋值。
示例:(a<b?a:b)=100;
Switch语句
switch 是“开关”的意思,它也是一种“选择”语句,但它的用法非常简单。switch 是多分支选择语句。说得通俗点,多分支就是多个 if。
switch (表达式)
{
case 常量表达式1: 语句1
case 常量表达式2: 语句2
┇
case 常量表达式n: 语句n
default: 语句n+1
}
当switch后面括号内“表达式”的值与某个case后面的“常量表达式”的值相等时,就执行此case后面的语句。执行完一个case后面的语句后,流程控制转移到下一个case继续执行。如果你只想执行这一个case语句,不想执行其他case,那么就需要在这个case语句后面加上break,跳出switch语句。
示例:
# include <stdio.h>
int main(void)
{
int val; //variable的缩写, “变量”的意思
printf("请输入您想去的楼层:");
scanf("%d", &val);
switch (val)
{
case 1:
printf("1层开!/n");
break;
case 2:
printf("2层开!/n");
break;
case 3:
printf("3层开!/n");
break;
default:
printf("该层不存在, 请重新输入/n");
}
return 0;
}
循环结构
While循环
原理:首先判断条件表达式的值,如果它为真,则循环体中的每个语句都被执行;然后,再次判断条件,如果条件表达式仍为 真,则循环体再次执行。如此循环往复,直到条件表达式结果为假。当然只要条件表达式一直为真,则循环体中语句无限循环执行,当然这种无限循环的情况在正常程序中是不存在的,因为计算机程序中循环一定是有限次的,即我们一定要为循环提供一个肯定会发生的终止条件。
语法:while(条件表达式或循环条件) { 循环体- 逻辑 }
流程图
示例:累加1-100整数和
一定存在条件表达式为假终止循环体:
//一定存在条件表达式为假终止循环体
int i=1;
int sum=0;
while(i<100)
{
sum+=i;
i++;
}
循环体中逻辑判断主动跳出循环体:
int i=1;
int sum=0;
while(True)
{
sum+=i;
i++;
if(i>100)
break;
}
do...while循环语句
语法:do{ 循环体- 逻辑 } while(条件表达式或循环条件);
说明:do...while 语句其实是while语句的一个变体。与while区别在于do...while一定会先执行循环体的逻辑语句,然后再进行条件表达式的判断,来决定是否进行下一次循环。
先用上面的示例看一下do...while语法:
int i=1;
int sum=0;
do
{
sum+=i;
i++;
}
while(i<100) ;
使用do...while判断水仙花数示例
for循环
作用:满足循环条件,执行循环语句
语法:for(起始表达式;条件表达式;更新表达式){循环语句;}
- 第一个表达式是初始化表达式,它通常用于将计数器初始化为其起始值。这是循环执行的第一个动作,只做一次。
- 第二个表达式是条件表达式。它以与 while 和 do-while 循环中的条件表达式相同的方式判断条件,并控制循环的执行。只要这个条件为真,则执行for 循环的循环主体。与 while 循环一样,因此它在每次迭代之前判断条件表达式。
- 第三个表达式是更新表达式。在执行完 for 循环主体后,控制流会跳回上面的 更新表达式 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。通常,这是一个递增循环计数器变量的语句。
优点:for循环结构清晰,简洁,操作方便,可直接遍历序列索引。应用范围广,比较常用。
示例
for( int a = 10; a < 20; a++ )
{
cout << "a 的值:" << a << endl;
}
测试更新表达式执行几次
#include <iostream>
#include "stdlib.h"
int main()
{
int i;
for (i = 0; i < 2; i++)
{
/* code */
}
std::cout<<i;
return 0;
}
输出2
,即更新表达式只执行2次,且循环主体上一次结束后先执行更新表达式,再验证条件表达式。
嵌套循环
一个循环内可以嵌套另一个循环。C++ 允许至少 256 个嵌套层次。
详细见菜鸟教程C++ 嵌套循环 | 菜鸟教程 (runoob.com),此处不作过多介绍。
跳转语句
参考:跳转语句 (C++) | Microsoft Learn
break语句
作用:用于跳出开关语句(switch语句)或循环结构
#include <iostream>
using namespace std;
int main()
{
// An example of a standard for loop
for (int i = 1; i < 10; i++)
{
if (i == 4) {
break;
}
cout << i << '/n';
}
// An example of a range-based for loop
int nums []{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i : nums) {
if (i == 4) {
break;
}
cout << i << '/n';
}
}
参考:break 语句 (C++) | Microsoft Learn
continue语句
作用:用于跳出循环结构中本次循环后,下次继续执行循环。
将不会执行当前迭代中的所有剩余语句。 确定循环的下一次迭代,如下所示:
- 在
do
或while
循环中,下一个迭代首先会重新计算do
或while
语句的控制表达式。 - 在
for
循环中(使用语法for( <init-expr> ; <cond-expr> ; <loop-expr> )
),将执行<loop-expr>
子句。 然后,重新计算<cond-expr>
子句,并根据结果确定该循环结束还是进行另一个迭代。
// continue_statement.cpp
#include <stdio.h>
int main()
{
int i = 0;
do
{
i++;
printf_s("before the continue/n");
continue;
printf("after the continue, should never print/n");
} while (i < 3);
printf_s("after the do loop/n");
}
Output:
before the continue
before the continue
before the continue
after the do loop
goto语句
goto语句无条件地将控制转移到由指定标识符标记的语句。
标记:在某条语句前添加一个标记定义 ,语法: 标记别名:
如flag:
由 标识符
指定的标记语句必须位于当前函数中。 所有 标识符
名称都是内部命名空间的成员,因此不会干扰其他标识符。
语句标签仅对 goto
语句有意义;否则,将忽略语句标签。 不能重新声明标签。
不允许 goto
语句将控制转移到跳过该位置范围内任何变量的初始化的位置。 以下示例引发错误
int goto_fn(bool b)
{
if (!b)
{
goto exit; // C2362
}
else
{ /*...*/ }
int error_code = 42;
exit:
return error_code;
}
原因:上面跳转的目标,error_Code还未初始化。
示例:
// goto_statement.cpp
#include <stdio.h>
int main()
{
int i, j;
for ( i = 0; i < 10; i++ )
{
printf_s( "Outer loop executing. i = %d/n", i );
for ( j = 0; j < 2; j++ )
{
printf_s( " Inner loop executing. j = %d/n", j );
if ( i == 3 )
goto stop;
}
}
// This message does not print:
printf_s( "Loop exited. i = %d/n", i );
stop:
printf_s( "Jumped to stop. i = %d/n", i );
}
注意:有一种较好的编程风格,是尽可能使用 break
、continue
和 return
语句而不是 goto
语句。 但是,由于 break
语句仅退出循环的一个级别,可能必须使用 goto
语句来退出深度嵌套的循环。