6.8.4 选择语句
语法
1、selection-statement:
if ( expression ) statement
if ( expression ) statement else statement
switch ( expression ) statement
语义
2、一条选择语句在一组语句中选择,依赖于一条控制表达式的值。
3、一条选择语句是一个语句块,其作用域是其封闭语句块的一个严格的子集。每个相关联的子语句也是一个语句块,其作用域是该选择语句作用域的一个严格子集。
6.8.4.1 if语句
约束
1、一条if语句的控制表达式应该具有标量类型。
语义
2、在两种形式下,如果表达式比较不等于0,那么第一个子语句会被执行。在else形式下,如果表达式比较等于0,那么第二条子语句会被执行。如果第一条子语句通过一个标签达到,那么第二条子语句不被执行。
3、一个else在词法上与之前最近的if相关联,如果该if在语法上被允许。
6.8.4.2 switch语句
约束
1、一条switch语句的控制表达式应该具有整数类型。
2、如果一条switch语句具有一个相关联的case或default标签在一个标识符作用域内,该标识符具有一个可变修改类型,那么整个switch语句应该在此标识符的作用域内。[注:即,该声明要么在switch语句前,要么它跟在最后一条case语句或default标签之后,这些标签与switch相关联,在包含该声明的语句块中。]
3、每个case标签的表达式应该是一个整数常量表达式,并且在同一条switch语句中,任意两个case常量表达式在转换后不应该具有相同值。在一条switch语句中最多可以有一个default标签。(任一封闭的switch语句可以具有一个default标签或case常量表达式,带有复制case常量表达式的值。)
语义
4、一条switch语句使得控制跳转到、或跳入、或跳过switch体的语句,依赖于一个控制表达式的值,以及依赖于是否存在一个default标签以及任何case标签的值。一个case或default标签仅仅在最近的封闭的switch语句内可访问。
5、整数晋升在控制表达式上执行。在每个case标签上的常量表达式被转换为控制表达式所晋升的类型。如果一个转换后的值匹配被晋升的控制表达式,那么控制跳转到跟在所匹配的case标签后的语句。否则,如果有一个default标签,那么控制跳转到标签语句。如果没有被转换的case常量表达式匹配,并且也没有default标签,那么整个switch体都不被执行。
实现限制
6、正如在5.2.4.1所讨论的,实现可以限制一条switch语句中的case值的个数。
7、例 在以下程序片段中
switch (expo) { int i = 4; f(i); case 0: i = 17; /* 直通到default代码 */ default: printf("%d ", i); }
标识符为i的对象,为自动存储周期(在语句块内),但从未被初始化,因而如果控制表达式具有一个非零值,对printf函数的调用将访问一个中间值。类似的,对函数f的调用无法被到达。