下载
第3章 控 制 流
一个语言的控制流语句用于指定各个计算执行的次序。在前面的例子中我们已经见到了一
些最常用的控制流结构。本章将全面讨论控制流语句,更精确、更全面地对它们进行介绍。
3.1 语句与分程序
在诸如x =0 、i + +或printf (...) 之类的表达式之后加上一个分号( ; ),就使它们变成了语句 :
x = 0;
i++;
printf(……);
在C语言中,分号是语句终结符,而不是像 P a s c a l等语言那样把分号用做语句之间的分隔符。
可以用一对花括号 {与}把一组说明和语句括在一起构成一个复合语句(也叫分程序),复合
语句在语法上等价于单个语句,即可以用在单个语句可以出现的所有地方。一个明显的例子是
在函数说明中用花括号括住的语句,其他的例子有在 i f 、e l s e 、w h i l e与f o r之后用花括号括住的多
个语句。 (在任何分程序中都可以说明变量,第4 章将对此进行讨论。)在用于终止分程序的右花
括号之后不能有分号。
3.2 if-else语句
i f - e l s e语句用于表示判定。其语法形式如下:
if (表达式)
语句
1
else
语句
2
其中e l s e部分是任选的。在 i f语句执行时,首先计算表达式 的值,如果其值为真(即,如果表达
式的值非0 ),那么就执行语句 ;如果其值为假(即,如果表达式 的值为0 ),并且包含e l s e部分,
1
那么就执行语句 。
2
由于i f语句只是测试表达式的数值,故表达式可以采用比较简捷的形式。最明显的例子是用
if (表达式)
代替
if (表达式 != 0 )
有时这样既自然又清楚,但有时又显得比较隐秘。
由于i f - e l s e语句的e l s e部分是任选的,当在嵌套的 i f语句序列中缺省某个 e l s e部分时会引起歧
在表达式后加上分号构成的语句叫做表达式语句。—译者注
第3章 控 制 流计计45
下载
义。这个问题可以通过使每一个 e l s e与最近的还无e l s e匹配的i f匹配。例如,在如下语句中:
if ( n > 0 )
if ( a > b )
z = a;
else
z = b;
e l s e部分与嵌套在里面的 i f 匹配,正如缩入结构所表示的那样。如果这不是我们所希望的,那么
可以用花括号来使该e l s e部分与所希望的i f强制结合:
if ( n > 0 ) {
if ( a > b )
z = a;
}
else
z = b;
歧义性在有些情况下特别有害,例如,在如下程序段中:
if ( n >= 0 )
for ( i = 0; i < n; i++ )
if ( s[i] > 0) {
printf ( "…" );
return i;
}
else /* 错 */
printf ( "error -- n is negative\n" );
其中的缩入结构明确地给出了我们所希望的结果,但编译程序无法得到这一信息,它会使 e l s e部
分与嵌套在里面的 i f 匹配。这种错误很难发现,因此我们建议在 i f语句嵌套的情况下尽可能使用
花括号。
顺便请读者注意,在语句
if ( a > b )
z = a;
else
z = b;
中,在z = a 后有一个