1.二路分支
- 逻辑:程序中某段代码需要在满足某个条件时才能运行
- 形式:
-
- if 语句:表达一种 如果-则 的条件执行关系
- if-else 语句:表达一种 如果-否则 的互斥分支关系
语法:
if ( 判断表达式 )
{
// 代码块
}
解析:
如果判断表达式的值为真(非零) ,那么代码块中的代码将会被执行,相反如果判断表达式为假则代码块不会被执行。
if( 判断表达式 )
{
// 代码块 1
}
else
{
// 代码块 2
}
解析:
如果判断表达式为真则执行代码块1 , 否则执行代码块2 。 因此两个代码块只会二选一执行一个。
if( 判断表达式1 )
{
// 代码块 1
}
else if ( 判断表达式2 )
{
// 代码块 2
}
else if( 判断表达式3 )
{
// 代码块 3
}
.....
.....
else if ( 判断表达式 N )
{
// 代码块N
}
else // 表示以上的所有条件都不满足
{
}
解析:
以上代码框架可以在N个代码块中根据实际条件来选择执行其中的某一个代码块。
注意在使用if或if-else 语句的时候可以省略大括号,但是需要注意,当省略掉大括号后,if 语句或if-else 语句中只能出现一个逻辑语句,如果有多个逻辑语句则会打断if-else 语句的连招。
如下 第三行代码会打破if-else-if 的连续性,编译器会直接报错。
if (Num < 100 )
printf("Num小于100\n");
printf("恭喜你找到了正确的学习方法...\n");
else if (Num > 100 )
printf("Num大于100\n");
else
printf("Num等于100\n");
- 注意:
-
- if 语句可以单独使用,else 语句不可以,else 语句必须跟if语句配套使用
- 不管是 if 语句还是 else 语句,代码块都必须使用大括号{}括起来,否则只有首个逻辑语句有效
2.多路分支
- 逻辑:根据不同的条件执行不同的代码片段
- 语法:
switch ( 整型表达式 )
{
case 预估值1 :
// 代码块1
break;
case 预估值2 :
// 代码块2
break;
case 预估值3 :
// 代码块3
break;
case 预估值N :
// 代码块N
break;
default :
// 代码块N + 1
break ;
}
switch(n)
{
case 1:
printf("one\n");
break;
case 2:
printf("two\n");
break;
case 3:
printf("three\n");
break;
default:
printf("其他数字\n");
}
- 要点解析:
- switch(n) 语句中的 n 必须是一个整型表达式,即 switch 判断的数据必须是整型
- case 语句只能带整型常量,包括普通整型或字符,不包括 const 型数据。
- break 语句的作用是跳出整个 swtich 结构,没有 break 程序会略过下一个case的判断往下执行,直到遇到break为止
- default 语句不是必须的,一般放在最后面(因此不需要 break)
- if-else 语句与switch 语句有很多相似的地方,但是有一个最大的不同,if-else 的每一个判断表达式之间可以没有任何联系,但是switch-case 语句中中所有的case都用于判断是否等于switch语句中的整型值。
3.const
- 逻辑:使一个变量不可修改(常量)
- 作用:
- 修饰普通变量,使之不可修改 (并不常见)
- 修饰指针变量,使之不可修改或者使其指向的目标不可修改 (非常常见一般用于保护内存不被意外修改)
- 示例:
int const a = 100; // 定义了一个不可修改的变量a
const int b = 200; // 定义了一个不可修改的变量b
a = 101; // 错误
b = 202; // 错误
4.while与 do…while循环
- 逻辑:使得程序中某一段代码可以重复循环地运行
- 形式:
- while 循环:先判断,再循环
- do-while 循环:先循环,再判断
语法:
// while 只要布尔表达式的值为真,则会不停地循环执行代码块的内容 :
while ( 布尔表达式 )
{
// 代码块
}
// do-while 先执行代码块,然后再对表达式进行判断,如果为真则循环执行,否则跳出
do
{
// 代码块
}while( 布尔表达式 ) ;
- 语法点:
- while 循环先进行判断,条件为真后才执行循环体,因此循环体可能一遍也不执行。
- do-while 循环先执行循环体,再进行判断,因此循环体至少会执行一遍。
- do-while 循环中的 while 语句后面有分号; 而 while中需要注意不要随便添加;否则会进入逻辑问题中。
5.for循环
- 逻辑:与 while 循环类似,但更加紧凑,for 循环将控制循环的变量集中在一行
- 语法:
for ( 表达式1 ; 表达式2 ; 表达式3 )
{
// 需要循环的代码块
}
表达式1: 一般用于初始化循环控制的变量 , 比如 int i = 0
只有满足C99 的编译规则才允许在该语句下定义变量,
如果报错则可以:
把定义语句写到for循环外面(前面)
编译命令中指定使用C99编译规则: gcc xx.x -std=c99
表达式2: 一般是判断条件, 用于判断循环控制变量是否在某一个范围 比如 i < 100 ;
表达式3: 一般是循环控制变量的迭代语句 比如 i ++
- 示例:
// 循环输出一系列整数,直到100为止
int a;
for(a=30; a<=100; a++)
{
printf("%d\n", a);
}
语法点:
-
- 循环头的标准语法是: for(表达式1 ; 表达式2 ; 表达式3)
- 表达式1一般用来初始化循环控制变量,它只有在第一个进入循环体的时候执行一次。
- 表达式2一般用来作为循环判定条件,为真则进入循环,为假则跳出循环, 在每一次执行代码块之前执行该语句
- 表达式3一般用来更新循环控制变量 , 在每一次代码块执行结束之后,下一次判断之前被执行
- 三个表达式均可以省略,但分号不能省略
6.break与continue
- 逻辑:
- break:① 跳出 switch 语句; ② 跳出当层循环体
- continue:结束当次循环,进入下次循环(while / for )
switch(n)
{
case 1:
printf("one\n");
break; // 跳出 switch 语句
case 2:
printf("two\n");
break;
}
while(1)
{
int n = scanf("%d", &a);
if(n == 0)
break; // 跳出当层 while 循环体
}
for(int i=1; i<=100; i++)
{
if(i%7 == 0)
continue; // 跳过所有能被7整除的数
printf("%d\n", i);
}
7.goto语句
- 逻辑:无条件跳转
- 语法:
....
.....
......
标签:
代码......
...
.....
goto 标签;
...
.....
- 示例:
int main()
{
printf("%d\n", __LINE__); // 打印第3行
// 无条件跳转到label处
goto label;
printf("%d\n", __LINE__); // 打印第7行,此处被略过
label:
printf("%d\n", __LINE__); // 打印第9行
}
- 语法:
- goto语句直接跳转到本代码块中的标签处
- 标签指的是以冒号结尾的标识符
- 作用:
- goto语句的无条件跳转不利于程序的可读性,一般不建议使用
- goto语句常被用在程序的错误处理中
int main(void) { // 初始化蓝牙设别 if (init == false ) { goto label1 ; } // 初始化WIFI设备 if (init == false ) { goto label2 ; } // 初始化显示器设备 if (init == false ) { goto label3 ; } // 初始化空调 if (init == false ) { goto label4 ; } label4: // 卸载、释放空调设别用到的所有资源 label3: // 卸载、释放显示器设别用到的所有资源 label2: // 卸载、释放WIFI设别用到的所有资源 label1: // 卸载、释放蓝牙设别用到的所有资源 }
8.结语
在本篇博客中,我们深入探讨了C语言中的控制流语句,包括条件语句(如 if
和 switch
)、循环语句(如 for
、while
和 do while
)以及跳转语句(如 break
、continue
和 return
)。这些控制流结构为程序的决策和重复执行提供了灵活性,使得开发者能够准确地控制代码的执行流程。
掌握控制流是学习 C语言的关键,它为实现复杂的逻辑和算法奠定了基础。通过合理使用这些结构,我们可以编写出更高效、更清晰的代码。在编写程序时,注重逻辑结构的设计,能够帮助我们更好地应对各种编程挑战。
希望读者在今后的学习和实践中,能够灵活运用控制流语句,解决实际问题,提升编程能力。感谢您阅读本博客,如果您有任何疑问或建议,欢迎在下方留言讨论!