语句

语句就是一行以 ; 结束的代码。

空语句

空语句就是一个孤零零的 ;,啥也不做。一般用于延时或单纯的占位。某些公司或自动测试要求要有完整的 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:
        语句;
}

注意几点:

  1. case后面跟表达式的必须是常量表达式,这个值和全局变量的初始值一样必须在编译时计算出来。
  2. 浮点型不适合做精确比较,所以C语言规定case后面跟的必须是整型常量表达式
  3. 进入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. 执行表达式1
  2. 执行表达式2,若为真,则执行一次 {} 内的语句
  3. 执行表达式3
  4. 从 2. 开始重复
for(表达式1;表达式2;表达式3)
{
    语句;
}

for 语句中的表达式1,2,3 都可以省略,但 ; 不能省略。

提高循环语句效率的两种方法:

  1. 多重循环中,把长循环放里面,短循环放外面,以减少 CPU 切换循环层的次数
  2. 若循环内存在跳转语句,可以的话,应该将跳转放在外面

跳转语句

break 用在 swith 和循环语句中,可使程序跳出 switch 或当前循环,执行循环后面的语句。注意,在多重循环中,break 只能跳出一层,要跳出多层要用 goto

while(条件)
{
    if(条件) break;
}

goto 是一种无条件转移语句。执行后,会跳转到标号并执行后面的语句。

mark: 语句;
goto mark;

goto 会造成一些混乱,所以尽量慎用。

continue 用在循环语句中,可以跳过当前循环中剩余的语句,而强制执行下一次循环。

for(;;)
{
    if(条件) break;
}