语句就是一行以 ;
结束的代码。
空语句
空语句就是一个孤零零的 ;
,啥也不做。一般用于延时或单纯的占位。某些公司或自动测试要求要有完整的 if-else
,此时就可能需要空语句占位。
基础语句
就两种:表达式语句(前面讲过)和函数语句(下一节会将),没啥讲的。
分支语句
基础语句是按顺序执行的,如果想有选择性的执行语句,可以用分支语句。if
语句的格式如下:
if(条件)
{
;
}
else
{
;
}
else
可以省略(如果没有语句要执行的话)。另外,如果 {}
内只有一条语句,那么{}
也可以省略(但不建议)。
多个if-else
可以嵌套使用,比如:
if( )
{
if( );
else;
}
else
{
if( );
else;
}
else
默认与上一个最近的 if
配对。比如下面这个程序:
int a=1;
if(a==0)
if(a==1)
else
printf('%d',a);
应该理解为:
int a=1;
if(a==0)
{
if(a==1)
else printf('%d',a);
}
如果想要多个分支,可以用 switch-case
语句:
switch (控制表达式){
case 常量表达式:
语句;
case 常量表达式:
语句;
default:
语句;
}
注意几点:
- case后面跟表达式的必须是常量表达式,这个值和全局变量的初始值一样必须在编译时计算出来。
- 浮点型不适合做精确比较,所以C语言规定case后面跟的必须是整型常量表达式
- 进入case后如果没有遇到break语句就会一直往下执行,后面其它case或default分支的语句也会被执行到,直到遇到break,或者执行到整个switch语句块的末尾。通常每个case后面都要加上break语句,但有时会故意不加break来利用这个特性
多分支时,switch 的效率比 if-else 高。
比较条件
- 尽管零值为 false,非零为 true,但 true 实际的值并没有统一标准,所以不要将布尔变量与
true
,false
,1
,0
进行比较; - 浮点变量不能用
==
或!=
与任何数字比较,必须转化成<=
或>=
- 指针应该与
NULL
比较,而不是零值
循环语句
while
语句:只要条件满足就执行一次语句,然后再检查条件,再执行。
while(条件)
{
语句;
}
do-while
语句:先执行一次语句,再检查条件,再重复。
do
{
语句
}while(条件); //注意不要漏了这个分号
for
语句:
- 执行表达式1
- 执行表达式2,若为真,则执行一次
{}
内的语句 - 执行表达式3
- 从 2. 开始重复
for(表达式1;表达式2;表达式3)
{
语句;
}
for
语句中的表达式1,2,3 都可以省略,但 ;
不能省略。
提高循环语句效率的两种方法:
- 多重循环中,把长循环放里面,短循环放外面,以减少 CPU 切换循环层的次数
- 若循环内存在跳转语句,可以的话,应该将跳转放在外面
跳转语句
break
用在 swith
和循环语句中,可使程序跳出 switch
或当前循环,执行循环后面的语句。注意,在多重循环中,break
只能跳出一层,要跳出多层要用 goto
while(条件)
{
if(条件) break;
}
goto
是一种无条件转移语句。执行后,会跳转到标号并执行后面的语句。
mark: 语句;
goto mark;
goto
会造成一些混乱,所以尽量慎用。
continue
用在循环语句中,可以跳过当前循环中剩余的语句,而强制执行下一次循环。
for(;;)
{
if(条件) break;
}