ISO/IEC 9899:2011 条款6.8.4——选择语句

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语句具有一个相关联的casedefault标签在一个标识符作用域内,该标识符具有一个可变修改类型,那么整个switch语句应该在此标识符的作用域内。[注:即,该声明要么在switch语句前,要么它跟在最后一条case语句或default标签之后,这些标签与switch相关联,在包含该声明的语句块中。]

3、每个case标签的表达式应该是一个整数常量表达式,并且在同一条switch语句中,任意两个case常量表达式在转换后不应该具有相同值。在一条switch语句中最多可以有一个default标签。(任一封闭的switch语句可以具有一个default标签或case常量表达式,带有复制case常量表达式的值。)

语义

4、一条switch语句使得控制跳转到、或跳入、或跳过switch体的语句,依赖于一个控制表达式的值,以及依赖于是否存在一个default标签以及任何case标签的值。一个casedefault标签仅仅在最近的封闭的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\n", i);
}

标识符为i的对象,为自动存储周期(在语句块内),但从未被初始化,因而如果控制表达式具有一个非零值,对printf函数的调用将访问一个中间值。类似的,对函数f的调用无法被到达。

posted @ 2016-01-01 03:27  zenny_chen  Views(273)  Comments(0Edit  收藏  举报