语句
C语言规定每条语句都以分号结尾。
C语句可以分为以下 5 种:
- 控制语句
- if() ~ else ~
- for() ~
- while() ~
- do ~ while()
- continue
- break
- switch
- goto
- return
- 函数调用语句
- 表达式语句(表达式末尾加个分号)
- 空语句(空语句中只含有一个单独的分号)
- 复合语句(用花括号括起来的多个语句和声明,又称语句块)
选择语句
if 语句和 switch 语句都需要首先检测一个值,即条件。
条件(condition)是一个表达式。
if语句
if语句有三种形式
第一种基本形式:if
if (条件)
语句
条件可能是一个表达式,也可能是一个声明。
如果条件的值为真,则执行其后的语句。
如果条件的值为假,则不执行该语句。
if(value) //判断变量值
if(value != 0) //判断表达式的值
if(p != nullptr) //判断指针是否指向一个有效的对象
C语言使用整数表示布尔值(真或假,即 1 或 0)。
在C语言中,所有的非零值都被认为是真。
第二种形式为: if-else形式
if(条件)
语句 1;
else
语句 2;
如果条件的值为真,则执行语句1。
如果条件的值为假,则执行语句2 。
第三种形式为 if-else-if 形式
if(条件 1)
语句 1;
else if(条件 2)
语句 2;
else if(条件 3)
语句 3;
......
else if(条件 m)
语句 m;
else
语句 n;
依次判断条件的值,当出现某个值为真时,则执行其对应的语句;然后跳到整个 if 语句之外继续执行程序。
如果所有的条件均为假,则执行语句n。
最后继续执行后续程序。
if语句的嵌套
C语言规定,else 总是与它前面最近的 if 配对。
多分支选择结构与switch语句
多分支选择 switch 语句, 其一般形式为:
switch(条件)
{
case 常量表达式 1: 语句 1;
case 常量表达式 2: 语句 2;
......
case 常量表达式 n: 语句 n;
default : 语句 n+1;
}
- 计算条件的值。
- 逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,便执行其后的语句。
- 然后不再进行判断,继续执行后面所有 case 后的语句。
- 如果表达式的值与所有 case 后的常量表达式均不相同时,则执行 default 后的语句。
说明:
- 每个 case 后面必须是整型或枚举类型的常量表达式。
- 在同一个 switch 语句中,一个值最多被 case 标签使用一次。
- case 常量表达是后面必须有一个冒号“
:
”。 - 在 case 语句的最后增加 break 语句, 使每次执行之后均可跳出switch语句,可避免输出不应有的结果。
- 在 case 后,允许有多个语句,可以不用花括号起来。
- 各 case 和 default 子句的先后顺序可以变动,而不会影响程序执行结果。
- 在每个 switch 语句后面使用 default 子句,可以检测非法值。
- default 语句可以省略。
循环结构和循环语句
用while语句构成循环
while 语句的一般形式为:
while(条件)
语句块
其中,条件是循环条件,语句块为循环体。
先计算条件的值,当值为真时,执行循环体语句。
当值为假时,不执行循环体语句。
无限循环:
while(1);
用do-while语句构成循环
do-while 语句的一般形式为:
do
语句块
while(条件);
它先执行循环体中的语句,然后再判断条件是否为真, 如果为真则继续循环;如果为假, 则终止循环。
因此,do-while 循环至少要执行一次循环语句。
用for语句构成循环
for 语句的一般形式为:
for(表达式 1; 表达式 2; 表达式 3)
语句块
它的执行过程如下:
- 先求解表达式 1,它只在循环开始时执行一次。
- 求解表达式 2,若其值为真,则执行 for 语句中指定的内嵌语句,然后执行下面第 3)步;若其值为假(0),则结束循环,转到第 5)步。
- 求解表达式 3。
- 转回上面第 2)步继续执行。
- 循环结束。
for 语句常用的应用形式也是最容易理解的形式如下:
for (循环变量赋初值; 循环条件; 循环变量增量) {语句块}
/*for 语句的惯用法*/
for(i = 0; i < n; i++){} //从 0 向上加到 n-1
for(i = 1; i <= n; i++){} //从 1 向上加到 n
for(i = n - 1; i >= 0; i--){} //从 n-1 向下减到0
for(i = n; i > 0; i--){} //从 n 向下减到1
- 表达式 1 和表达式 3 可以是一个简单表达式也可以是逗号表达式。
int i,j;
for(i=0,j=0; i<n || j<n; i++,j++){}
- 表达式 2 一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值非零。
- for 语句括号内的表达式都可省略,但分号不能省略。
for( ; ; ){}
- 如果表达式 1 省略,需在 for 语句之前循环变量赋初值。
int i = 0;
for( ; i < n; i++){}
- 如果表达式 2 省略,程序死循环。
C99 允许在 for 语句内声明变量,作用域仅在 for 循环内部。
跳转语句
break语句
break 语句负责终止离它最近的 while、do-while、for 或 switch 语句,并从这些语句之后的第一条语句开始继续执行。
- break 语句只能使用在循环语句和 switch 开关语句中。
- break 语句对 if-else 的条件语句不起作用。
- 在多层循环中, 一个 break 语句只向外跳一层。
- 如果 switch 语句嵌套在了 while 语句中,它可以把程序控制从 switch 语句中转移出来,但是却不能跳出 while循环。
continue语句
continue 语句的作用是跳过循环本中剩余的语句而执行下一次循环。
continue 语句只能用于循环语句。
goto语句
goto 语句的作用是从 goto 语句无条件跳转到同一函数内的另一条语句。
goto 标识符;
标识符 语句
C99增加了一条限制:goto 语句不可以用于绕过变长数组的声明。