第三章 流程控制

流程控制 3种:

1.顺序逻辑 ,代码从main函数开始,一条挨着一条执行,直到最后。

2.分支逻辑, 代码从main函数开始,有选择性的执行,直到最后。

3.循环逻辑 代码从main函数开始,对某一段代码执行多次后,直到最后

顺序逻辑的流程图

分支流程图

关系(比较)运算符

比较运算符,操作的对象 数值型 (int float double )

比较运算符 功能 备注
> 大于 双目
>= 大于等于 双目
< 小于 双目
<= 小于等于 双目
== 等于,左右两边等值 双目 注意和 =(赋值) 的区别
!= 不等于 左右两边不等值 双目

使用关系运算符连接的式子 -》 关系表达式

关系表达式 值 ; 逻辑结果 1(真) 0 (假)

关系表达式的类型 int 由于int类型的值域非常大,除了 0,1 之外,还有很多数。所以有句话,==非0 即为真==。

逻辑运算符

操作对象 逻辑值 ( 0 1 ,)

运算符 功能 备注
&& 逻辑与 双目
|| 逻辑或 双目
逻辑非 单目

逻辑表达式 ,值的类型 int 逻辑结果 1(真) 0 (假)

逻辑与 ,左值和右值 同时都为真的情况下, 整个表达式的值为真 。 全部都要为真

逻辑或 ,左值和右值 只有有一个值为真, 整个表达式的值为真 。 只要一个为真

逻辑非 ,单目 右结合, 如果原来是真,则变假;如果原来是假,则变真。

截断效应,短路效应 ,(&& 和|| 运算符有关)

num  && b++ 
0     && b++   ;  对于 &&操作,如果左操作数为0 的情况下,右操作数是不会执行的。
在这个表达式中,虽然 ++ 是单目运算符。 但是 截断效应  比运算符的++优先级,更高。


printf("express is  %d\n",num  && b++) ; //  表达式的值 0    b ?  
printf("b is  %d\n",b);
express is  0
b is  1


num  || ++b;对于 ||操作,如果左操作数为1 的情况下,右操作数是不会执行的。
在这个表达式中,虽然 ++ 是单目运算符。 但是 截断效应  比++运算符的优先级,更高。

printf("express num || b++ is  %d\n",num  || ++b) ; //  表达式的值1   b ==1?  printf("b is  %d\n",b);
express num || b++ is  1
b is  1

三目运算符

结合方向从右向左 。

? :

表达式1 ? 表达式2: 表达式3

表达式1 ,类型 int ,结果应该是一个逻辑结果 。

如果 表达式1 的值 为 真 ,则执行表达式2

如果 表达式1 的值 为 假 ,则执行表达式3

 int num1 = 0 ;
    int num2 = 0;
    int max = 0 ;
    printf("找两数的最大数 :");
    scanf("%d%d",&num1,&num2);
    比较 num1 > num2 。如果为真 ,整个表达式的值 num1 ,否则是num2
    max =  num1 > num2 ? num1:num2;  
    printf("max is %d\n",max);

分支结构

对代码进行选择行的执行。

1 . if else

1)如果需要实现判断逻辑,就需要使用 if

2)if 后面要紧跟 表达式,使用圆括号,括起来。

3) if 可以单独使用 。else 需要和if配对使用,不能单独出现。

4) if,else 后需要被执行的语句,建议都使用大括号,括起来。即使是一句话

5) if,else 后不要加分号。

if (表达式) 
{
	代码块;
	语句块

}


1 ,现对表达式 ,进行求值。 如果表达式值 为真,则执行if后紧挨着的语句(使用大括号引起来,即使是一句话)。
2, if (表达式)  在这句话后面,不要加分号 。 如果加了的话,语法不会报错。 只有分号的话,是一个空语句,可能会导致逻辑不对。


二分支流程
if(表达式)

{
	语句块1;
	。。。。。
	。。。。
}
else      
{
	语句块2;
	。。。。。
	。。。。
}
对表达式 ,对表达式求值。 如果为真 ,就执行语句块1 部分。 如果为假 ,就执行	语句块2;
//else  不能单独出现,需要和if配对使用。会和最近的if配对。

两数交换

temp = b;
b = a;
a = temp;

2.阶梯分支

if (表达式 1) {

语句块1;

}

else if( 表达式 2)

{

语句块2;

}

else if( 表达式 3)

{

语句块3;

}

....

else

{

语句块n;

}

  1. if 嵌套形式
不建议嵌套层数太多 ,  3-5  层。 多了就不要阅读。
if(表达式1)

{

    if(表达式2)

    {

        if(表达式3)  ==  if(表达式1 &&表达式2 && 表达式3 )

        {

        	语句1;

        }
		
    }



}
  1. switch

多分支情况



switch(整形表达式)
{
	case 整形常量表达式1: //5
	语句块1;
	break;
	case 整形常量表达式2: //6
	语句块2;
	break;
	case 整形常量表达式3: //7 
	语句块3;
	break;
	
	default:
	语句块n;

}

整形表达式 计算下来的结果 ,会和case后面的 整形常量表达式 进行等值比较。 如果值相等则该 case 对应的语句块,就会被执行 ,直到遇到break。 

break; 停止,断开。在switch 中,执行遇到break ,意味 switch 分支结束。

default ,可以选。 如果有的话,switch 在匹配的过程中,如果case 都没有匹配成功,则执行default
对应的语句。 一般放在最后。

1) switch 后面必须是一个整形表达式

2) case 后面 整形的常量 ,不能是变量,或表达式

3)switch 的整形表达式 和 case 后面 整形的常量 ,做等值比较。 如果相等执行对应的case。 直到break 停止。 如果都没有匹配中,执行default;

循环控制

代码执行的时候,有多次执行同一段代码需求。

事先执行需要运行几次 for

未知执行次数的话 while

循环三要素:

1) 循环控制变量 需要初始化

2) 需要检测循环变量 ,是否继续循环

3)循环中,需要包含控制变量 变化的语句 ++,--

while
  1. while 的使用

while(表达式)
{
	循环体;

}
表达式 的值  是一个逻辑  。 1 ture  0 fasle
循环体; 代码会执行多次

1 对表达式求值 ,如果为 1(真) ,则执行循环体 。否则 ,循环结束
2 . 执行循环体 循环的代码
3.  执行 步骤1 

循环体 中,需要包含 使用循环慢慢趋势于结束的变量(循环体控制变量,++,--)
while(表达式);  不要假分号。

死循环

循环会一直运行  
while(1)
{
循环体;
}
for
for(表达式1;表达式2;表达式3)
{
循环体;
}
表达式1 , 变量初始化,或者循环运行起来前,需要初始化的变量
表达式2 , 决定循环是否会继续运行。如果为真,循环执行,否则循环停止
表达式3, 对循环控制变量,进行改变的地方(++,--)

执行的流程
1.执行表达式1  ,对控制变量初始化 。 只会走一次。
2. 对表达式2求值,如果为真,执行循环体。否则结束
3.执行循环体代码
4. 执行表达式3, 对控制变量 ++,--
5. 跳 第2步



死循环形式
for(;;)   分号不可以省略
{
循环体;

}

双层循环

int i =0;
int j = 0 ;
for(j=0;j<3;j++) // 外层
{

	for(i=0;i<5;i++)// 内层循环
	{
	
	
	}
}

外层循环 j++ 一次 ,则内层循环 执行5次

9 * 9 乘法表
int i = 0 ;
    int j = 0 ;
    for(j = 1 ;j <=9;j++)// row  
    {
        
        for(i=1;i<=j;i++)
        {
            printf("%d*%d=%d ",i,j,j*i);
        }
       // printf("\n");
       puts(" ");
    }

goto

无条件调整 。

goto 只能在 同一个函数内部 调整。 goto 相当与 汇编中的jmp 指令。

在应用层程序编程中,禁止使用。

在linux 内核编程中, 错误处理 ,用的多。

int  main()
{

    int i = 0 ;
    int sum = 0;
    //标号
loop:    
    sum+=i;
    i++;
    if(i<=10)
    {
        goto loop;
    }
    else  
    {
        //goto end 
    }

    printf("sum is %d\n",sum);

end:
    return 0;
}

do ...while()


do
{
循环体;
}while(表达式);

循环体至少执行一次。  while() 后面的分号,不可省略。否则语法报错。

1. 执行循环体
2. 表达式求值 ,如果真,则执行循环体。否则,循环终止。


int main()
{

    int i = 0 ;
    int sum = 0 ;
    do 
    {
        sum+=i;
        i++;
    }while(i<=10);

    printf("sum is %d\n",sum);
}


循环辅助控制

continue; //继续, 跳过本次循环

  1. 跳过本次循环
  2. 在循环的过程中,需要屏蔽其中某几次循环
 for(i=0;i<10;i++)
    {
    
        if(3==i || 5==i || 7==i )
        {
            continue;// 在循环过程中,i如果是3,5,7  ,直接执行下一次循环
        }
        printf("i is %d\n",i);
    }

break; // 跳出循环,提前结束循环

1) 跳出当前循环或switch

2)如果不希望循环继续 ,调用break

for(i=1;i<10;i++)
    {
    
        if(3==i || 5==i || 7==i )
        {
            break; //提前结束循环
        }
        printf("i is %d\n",i);
    }
    

    printf("end...\n");
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐