嵌入式:C语言流程控制:3种逻辑全解析
第三章 流程控制
流程控制 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;
}

- if 嵌套形式
不建议嵌套层数太多 , 3-5 层。 多了就不要阅读。
if(表达式1)
{
if(表达式2)
{
if(表达式3) == if(表达式1 &&表达式2 && 表达式3 )
{
语句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
- 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; //继续, 跳过本次循环
- 跳过本次循环
- 在循环的过程中,需要屏蔽其中某几次循环
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");
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)