C++流程控制语句

C++流程控制语句

语句是C++程序中的基本功能单元。任何一条C++语句都会为完成某项任务而进行相关的操作。C++语句通常以分号作为结束标志。

C++中的语句分为以下几种:

表达式语句:是最简单的语句形式,一般格式为:表达式;

空语句:只由一个分号构成的语句,一般格式为: ;

注意:空语句不执行任何操作,但具有语法作用。例如:for循环在有些情况下,循环体或者循环判别条件是空语句。

复合语句:由“{}”括起来的一组语句,一般格式为: { 若干语句序列 }

注意:复合语句描述一个块,在语法上起一个语句的作用。复合语句中的每个语句以“;”结束,而整个复合语句的结束符为“}”。

流程控制语句:用来控制或改变程序的执行方向的语句.

if语句

1、基本if语句

语法:

if(条件表达式)

    语句或语句块

if语句(单分支选择语句)执行流程图:

执行过程:首先计算条件表达式的值,如果此值不为 “真”,则执行语句或语句块;如果此值为 “假”,则忽略语句或语句块即不执行,而继续执行整个语句之后的语句。

例、输入一个整数,判断正负情况

#include <iostream>
using namespace std;
int main()
{
    int n;
    cout<<"请输入一个整数:"<<endl;
    cin>>n;
    if (n>0)
        cout<<"正";
    if (n==0)
        cout<<"零";
    if  (n<0)
        cout<<"负";
    return 0;
}

2、if - else语句

语法:

if(条件表达式)

    语句或语句块1

else

    语句或语句块2

If - else语句(双支选择语句)执行流程图:

执行过程:首先计算条件表达式的值,如果此值不为 “真”,则执行语句或语句块1,然后忽略后面的语句或语句块2去执行整个语句之后的语句;如果此值为 “假”,则忽略语句或语句块1执行语句或语句块2,然后继续执行整个语句之后的语句。

例、输入一个年份,判断是否为闰年。

#include <iostream>
using namespace std;
int main( ){
    int year;
    cout<<"输入年份:"<<endl;
    cin>>year;
    if (year%4==0&&year%100!=0||year%400==0)
        cout<<year<<"是闰年"<<endl;
    else  cout<< year<<"年不是闰年"<<endl;
    return 0;
}
 

3、if-else if-else语句(多分支选择语句)

if-else if-else语句(多分支选择语句)

if (条件1) {

    语句块1

}

else if (条件2) {

    语句块1

}

……

else {

    语句块K

}

if-else if- else语句(多分支选择语句)执行流程图:

使用if-else if-else多分支选择语句源码:

#include <iostream>

using namespace std;

int main() {

  int num;

  cout << "请输入一个数字:";

  cin >> num;

  // 使用if语句

  if (num > 0) {

    cout << "这是一个正数" << endl;

  } else if (num == 0) {

    cout << "这是零" << endl;

  } else {

    cout << "这是一个负数" << endl;

  }

  return 0;

}

If语句的嵌套

嵌套if语句有2种形式:

嵌套在else分支中,格式如下:

if (表达式1)

    语句或语句块1

else if (表达式2)

    语句或语句块2

    else if …...

        else语句或语句块k

嵌套在if分支中,格式如下:

if (表达式1){

    if (表达式2)

        语句或语句块1

     else

        语句或语句块2

}

else

语句或语句块3

配对原则

C++规定:在嵌套if语句中,if和else按照“就近配对”的原则配对,即相距最近且还没有配对的一对if和else首先配对。

if中嵌套的形式较容易产生逻辑错误,而else中嵌套的形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用在else分支中嵌套的形式,故对此进一步说明之:

if(条件表达式1)

    语句或语句块1

else if(条件表达式2)

    语句或语句块2

else if(条件表达式3)

    语句或语句块3

......

else

语句或语句块k

执行过程:从上向下逐一对if之后的条件进行检测。如果某一条件为“真”,则执行相应的if子句的语句或语句块并越过剩余的部分,然后继续执行整个语句之后的语句;如果所有条件都为“假”,则执行最后一个else子句的语句或语句块,然后继续执行整个语句之后的语句。

例、求三个整数中的最大值。

#include <iostream>
using namespace std;
int main(){
    int a, b, c, max;
    cout<<"输入三个整数:";
    cin>>a>>b>>c;
    if(a>b&&a>c)  max=a;
    else if(b>a&&b>c)  max=b;
        else  max=c;
    cout<<"最大数为:max="<<max<<endl;
    return 0;
}

switch语句

switch(表达式)

  {

    case 常量表达式1:

       语句或语句块1

       break;

    case 常量表达式2:

       语句或语句块2

       break;

    case 常量表达式3:

       语句或语句块3

       break;

    … …

    default:

       语句或语句块K

       [break;]

  }

执行流程参见下图(特别提示,与许多资料上的流程图相比,这个图表示的意思是比较全面准确的):

或图示为:

说明:

switch语句中的表达式 必须是一个整型、字符型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。

case 的 常量表达式1,常量表达式2等 必须与 switch 中的表达式量具有相同的数据类型,且必须是一个常量或字面量。在一个 switch 中可以有任意数量的 case 语句(case子句)。每个 case 后跟一个要比较的值(常量表达式)和一个冒号,其后语句或语句块可没有,且语句块(多条语句)不必用{}括起来。

break是可选的不是每一个 case 都需要包含 break。遇到break就跳出整个switch语句,如果子句中不包含 break,若有后续的子句,将接着处理后续的子句,而不论是否匹配,直至switch语句尾部或遇到下一个break,因此一般包含break!详见下面的例子。

default语句(default子句)可没有,若有一般将将default语句放在所有case语句结束之后。default顾名思义是处理缺省情况,当常量表达式都不匹配的情况下执行之。

例、

#include <iostream>
using namespace std;
 
int main ()
{
   char grade = 'D';
 
   switch(grade)
   {
   case 'A' :
      cout << "很棒!" << endl; 
      break;
   case 'B' :
   case 'C' :
      cout << "做得好" << endl;
      break;
   case 'D' :
      cout << "您通过了" << endl;
      break;
   case 'F' :
      cout << "最好再试一下" << endl;
      break;
   default :
      cout << "无效的成绩" << endl;
   }
   cout << "您的成绩是 " << grade << endl;
 
   return 0;
}

运行之,参见下图:

请留意输出结果:
您通过了
您的成绩是 D

为了了解C++中switch语句中break语句有什么用,现在将上例中break语句注释掉:
#include <iostream>
using namespace std;

int main ()
{
   char grade = 'D';
 
   switch(grade)
   {
   case 'A' :
      cout << "很棒!" << endl; 
      //break;
   case 'B' :
   case 'C' :
      cout << "做得好" << endl;
      //break;
   case 'D' :
      cout << "您通过了" << endl;
      //break;
   case 'F' :
      cout << "最好再试一下" << endl;
      //break;
   default :
      cout << "无效的成绩" << endl;
   }
   cout << "您的成绩是 " << grade << endl;
 
   return 0;
}

运行之,参见下图:

请留意输出结果:
您通过了
最好再试一下
无效的成绩
您的成绩是 D

对比上面的例子,可以看到区别:没有break,除了执行匹配的语句或语句块,还会顺序执行其后语句或语句块,而不论是否匹配,直至switch语句尾部或遇到下一个break。

:switch某个符合条件的case后不加break,为什么会执行后面不符合case的语句?

:switch起到的作用类似于跳转,满足switch的条件会跳转到对应的case下执行代码。如果不加break,代码会从那开始执行,不符合case的语句也会被执行,直到一直执行到最后或遇到下一个break才会跳出switch结构。】

循环语句

1、while语句
while(判断表达式)
    循环体

执行流程图:

当判断表达式(条件)为真时执行循环体;当条件为假时,程序流将循环语句后的语句。循环体是语句或语句块。
例、计算1+2+3+…+100的值。代码如下:
#include <iostream>
using namespace std;
const int n=100; //用常变量利于修改程序
int main(){
    int i=1,sum=0;   //循环初始条件
    while(i<=n){
      sum+=i;
      i++;    //修改循环条件
   }
   cout<<"sum="<<sum<<endl;
   return 0;
}

2、do-while语句
do
    循环体
while(判断表达式);

执行流程图:

 条件表达式出现在循环的尾部,所以循环体会在条件被测试之前至少执行一次。
如果条件为真,就会执行循环体,这个过程会不断重复,直到给定条件变为假为止。
例、输出1,2,……,10。代码如下:
#include <iostream>
using namespace std;

int main ()
{
   // 局部变量声明
   int a = 1;

   // do 循环执行
   do
   {
       cout << "a 的值:" << a << endl;
       a = a + 1;
   }while( a < 10 );
 
   return 0;
}

3、for循环语句
for(表达式1;表达式2;表达式3)
    循环体

执行流程(执行流程)参见下图:

 执行过程说明:
1) 计算表达式1的值,通常为控制变量赋初值;
2) 表达式2的值为真(或非0),则执行循环体;
3) 计算表达式3的值;
4) 再次计算表达式2的值,并重复以上过程;
5) 直到表达式2的值为假(或为0),则结束该循环。
循环初始条件可在表达式1中,循环条件的判断可包含在表达式2中,而循环条件变量的修改可包含在表达式3中,也可放在循环体中。

不太好理解?请看下图:


例、计算1+2+3+…+100的值。代码如下:
#include <iostream>
using namespace std;

int main(){
    int sum=0;
    for(int i=1 ; i<=100 ; i++) 
         sum +=i;
         
    cout << "sum = " << sum << endl;
    return 0;
}

运行之,参见下图:

for语句中的三个表达式可部分或全部省略,但两个分号不能省略。常见的是:将表达式1放在了for语句之前,或表达式3放在了循环体中,在for语句中就可相应地省略表达式1或表达式3。

以前面的“从1加到100的和”的代码为例

☆省略“表达式1(初始化条件)”:

int i = 1, sum = 0;

for( ; i<=100; i++){

    sum+=i;

}

☆省略了“表达式2(循环条件)”,如果不做其它处理就会成为死循环。例如:

for(i=1; ; i++) {

sum+=i;

if I > 100 then break //

}

☆省略了“表达式3(自增或自减)”,就不会修改“表达式2(循环条件)”中的变量,这时可在循环体中加入修改变量的语句。例如:

for( i=1; i<=100; ){

    sum=sum+i;

    i++;

}

循环的嵌套
当循环语句中的循环体又是一个循环语句时,就构成了“嵌套循环”。
for 语句、while语句和do-while语句均可以构成嵌套形式,这三种语句还可以互相嵌套。
例、打印如下图形。
        * * * * * * * * * * *
      * * * * * * * * * * *
    * * * * * * * * * * *
  * * * * * * * * * * *
* * * * * * * * * * *

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    int i,j;
    for(i=1;i<=5;i++){
      for(j=1;j<=5-i;j++)  cout<<"  " ;    //输出若干空格
      for(j=1;j<=11;j++)  cout<<"* ";           //输出若干*
      cout<<endl;            //准备输出下一行
   }
   return 0;
}

例、写一个九九乘法表
#include<iostream>
using namespace std;

int main()
{
    int i,j,t;
    for(i=1;i<=9;i++)
    {
        for(j=1;j<=i;j++)
        {
            t=j*i;
            cout<<j<<"*"<<i<<"="<<t<<"  ";
        }
        cout<<endl;
    }
    return 0;
}
 

运行之,参见下图:

循环控制语句

break语句
只能用在switch语句和循环语句(for循环、while循环和do-while循环)中。作用:跳出switch语句或提前终止循环。
使用break语句的例:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
    for (int i=1; i<20; i++){
      if (i % 3==0) break;  //能被3整除时,便由break退出循环
      cout<<i<<'\t';
    } 
    return 0;
}

运行之,参见下图:

continue语句
只能用在循环语句(for循环、while循环和do-while循环)中。作用:终止本次循环,即跳过其后尚未执行的循环体语句,并开始下一次循环。
使用continue语句的例:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
    for (int i=1; i<20; i++){
      if (i % 3==0) continue;  //能被3整除时结束本次循环
      cout<<i<<'\t';
    } 
    return 0;
}

运行之,参见下图:

continue语句与break语句的区别是:continue语句结束本次循环,而break语句是结束整个循环。

goto语句

控制程序从goto语句所在的位置,无条件跳转至程序中指定的label(标签)处。

一般使用形式:

goto label; //跳转到label处

label: //注意有一冒号,用来指明跳转位置

说明:其中label 是标识符。应用:在某些特定场合下,比如在多层循环嵌套中,要从深层循环跳出,若用break语句,需要使用多次可读性较差,这时goto语句可以发挥作用。需要注意的是,滥用goto语句可能导致代码混乱和难以维护。因此,在实际编程中,应避免过度使用goto语句,尽量使用结构化的控制流语句来代替。

使用goto语句的例:
#include <iostream>
using namespace std;
int main ()
{
   int a = 1;
   LOOP:
   do{
       if( a == 5)
       {
          a = a + 1;
          goto LOOP;
       }
       cout << "a 的值:" << a << endl;
       a = a + 1;
   }while( a < 10 );
 
   return 0;
}

运行之,参见下图:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值