1.二路分支
- 逻辑:程序中某段代码需要在满足某个条件时才能运行
- 语法:
if语句: if (布尔型表达式) // 如果 布尔型表达式 的结果位真则执行以下代码,否则不执行代码块 { // 代码块 }
- 型式:
-
- if 语句:表达一种 如果-则 的条件执行关系
- if-else 语句:表达一种 如果-否则 的互斥分支关系
if-else语句: if (布尔型表达式) // 如果 布尔型表达式 的结果位真则执行以下代码1, 否则则执行代码块2 { // 代码块1 } else { // 代码块2 }
- 注意: a.if 语句可以单独使用,else 语句不可以,else 语句必须跟if语句配套使用 ‘else’ without a previous ‘if’ .不管是 if 语句还是 else 语句,代码块都必须使用大括号 { } 括起来, 否则只有首句有效 (因此从可读性上不太建议这么使用)
2.使用二路分支if-esle 实现多路分支:
if (表达式1) // 如果 表达式1 的结果位真则执行以下代码1, 然后退出 ,否则判断表达式2
{
// 代码块1
}
else if (表达式2 ) // 如果 表达式2 的结果位真则执行以下代码2, 否则判断表达式 3
{
// 代码块2
}
else if (表达式3 )// 如果 表达式3 的结果位真则执行以下代码3, 否则判断表达式 n
{
// 代码块3
}
........
else // 如果以上的所有表达式都不为真 ,则执行代码块 N
{
// 代码块N
}
3.多路分支
- 逻辑:根据不同的条件执行不同的代码片段
- 概念: switch 会对 整型表达式 进行匹配判断 是否等于 case 中的某一个 整型常量 如果匹配则执行该case 中的代码块,否则会一直比较下去直到遇到default。
- 语法:
switch ( 整型表达式 )
{
case 整型常量1 :
// 代码块1
break ; // 用于跳出switch case 语句
case 整型常量2 :
// 代码块2
break ;
........
case 整型常量N :
// 代码块N
break ;
default :
// 代码块M
break ;
}
example:
int main(int argc, char const *argv[])
{
int Num = 0 ;
int RetVal = scanf("%d" , &Num);
if (RetVal != 1 )
{
fprintf( stderr , "scanf error ...\n");
printf("scanf error ...\n");
return -1 ; // 直接结束程序退出....
}
switch ( Num )
{
case 1:
printf("用户输入的是 1 ..\n");
case 2:
printf("用户输入的是 2 ..\n");
case 3:
printf("用户输入的是 3 ..\n");
break ;
case 4:
printf("用户输入的是 4 ..\n");
break ;
default :
printf("用户输入的并不是预想中的值 ..\n");
break ;
}
return 0;
}
- 要点解析:
a.switch(n) 语句中的 n 必须是一个整型表达式,即 switch 判断的数据必须是整型
b.case 语句只能使用整型常量,包括普通整型(1,2,3,4)或字符('a' , 'v' ,'n'),不包括 const 型变量。
c.break 语句的作用是跳出整个 swtich 结构,没有 break 程序会略过下一个case往下执行,直到遇到break 或整个switch-case语句结束
d.default 语句不是必须的,一般放在最后面(因此不需要 break)
4.while与 do…while循环
- 逻辑:使得程序中某一段代码可以重复循环地运行
- 形式:
- while 循环:先判断,再循环
- do-while 循环:先循环,再判断
语法:
while( 布尔表达式1 ) // 只要表达式 1 条件是满足的则会执行代码块中的内容
{ // 代码块 开始
if( 布尔表达式2 ) // 表达式2 满足的话则会执行 以下代码块
{
break; // 跳出当前while 循环体
}
// 代码块结束
}
注意:
只是用while循环语句的时候,只要while( 表达式 ) 中的表达式时成立的
那么循环将一直重复地运行下去,直到遇到以下情况:
- 在While 循环体中执行 return ,则会直接退出当前的函数
- 在 While 循环体中执行 break , 则会跳出当前的循环体
- 在While 循环体中执行 goto语句, 则会跳到指定的代码行进行执
5.break 的作用,是用于跳出当前循环结构
while(1)
{
while(2)
{
break ; // 直接跳出当前的 while 2
}
for( ......)
{
if(...)
{
break ; // 直接跳出当前的for
}
}
break ; // 直接跳出当前的 while 1
}
6.do-while的语法:
do
{
// 代码块 , 在任何的情况下 该代码块至少会被执行一次
}while( 布尔表达式 ) ; // 当执行了一次代码块后进入 判断表达式进行判断
- 语法点:
- while 循环先进行判断,条件为真后才执行循环体,因此循环体可能一遍也不执行。
- do-while 循环先执行循环体,再进行判断,因此循环体至少会执行一遍。
- do-while 循环中的 while 语句后面有分号;
7.for循环
- 逻辑:与 while 循环类似,但更加紧凑,for 循环将控制循环的变量集中在一行
- 语法:
for ( 表达式1 ; 表达式2 ; 表达式3 ) { // 需要循环执行的代码块 }
语法点:
-
- 循环头的标准语法是: for(表达式1 ; 表达式2 ; 表达式3)
- 表达式1一般用来初始化循环控制变量,可以是多个也可以是单个甚至没有,如果是多个的话需要使用逗号进行分割
- 表达式2一般用来作为循环判定条件,为真则进入循环,为假则跳出循环。 判断条件可以使用 && || 逻辑运算符把多个表达式合成一个
- 表达式3一般用来更新循环控制变量
- 三个表达式均可以省略,但分号不能省略 。 则表示一个死循环类似于 while(1)
- 示例:
// 循环输出一系列整数,直到100为止 int a; for(a=30; a<=100; a++) { printf("%d\n", a); }
注意:
在默认非使用C99 编译规则的编译器下编译程序有可能出现:如何解决:可以在 编译命令后面 加上选项 -std=c99 or -std=gnu99 即可
gcc 06\ for.c -std=c99 gcc 06\ for.c -std=gnu99
8.break与continue
- 逻辑:
- break:① 跳出 switch 语句; ② 跳出当层循环体
- continue:结束当次循环,进入下次循环
- 举例:
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); }
8.goto语句
- 逻辑:无条件跳转
- 语法:
goto 标签名; 标签名:
example: int main() { printf("%d\n", __LINE__); // 打印第3行 // 无条件跳转到label处 goto label; printf("%d\n", __LINE__); // 打印第7行,此处被略过 label: printf("%d\n", __LINE__); // 打印第9行 }
- 语法:
- goto语句直接跳转到本代码块中的标签处
- 标签指的是以冒号结尾的标识符
- 作用:
- goto语句的无条件跳转不利于程序的可读性,一般在应用层不建议使用,主要出现在驱动的源代码中(底层的代码)
- goto语句常被用在程序的严重错误处理中(硬件的初始化操作)
- 总结当程序出现了严重的错误,则可以使用goto 到程序的默认进行还原(释放空间...)并退出的操作