C++语言基础入门(3) – 程序流程结构

程序流程结构

顺序结构:顺序执行不发生跳转。

选择结构:依据条件的结构

选择结构

判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。

流程


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判断水仙花数示例

前言 马上就要熄灯了,写个水仙花数,写完就去洗澡。 题目 求一个数是不是水仙花数或输出某一范围[n,m……
2022-10-17

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 );
}

注意:有一种较好的编程风格,是尽可能使用 breakcontinue 和 return 语句而不是 goto 语句。 但是,由于 break 语句仅退出循环的一个级别,可能必须使用 goto 语句来退出深度嵌套的循环。

作者:Miracle
来源:麦瑞克博客
链接:https://www.unitymake.com/archives/programming-life/cpp/2080
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
THE END
分享
打赏
海报
C++语言基础入门(3) – 程序流程结构
程序流程结构 顺序结构:顺序执行不发生跳转。 选择结构:依据条件的结构 选择结构 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执……
<<上一篇
下一篇>>
文章目录
关闭
目 录