• 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
    ", i);
    }

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

  • 相关阅读:
    Linux命令-网络命令:netstat
    Linux命令-网络命令:traceroute
    Linux命令-网络命令:lastlog
    Linux命令-网络命令:last
    mongodb3.4 安装及用户名密码设置
    MySQL表名不区分大小写的设置方法
    数据库设计中的四个范式
    dubbo本地调试直连
    com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1169 > 1024)
    Linux服务器时间同步
  • 原文地址:https://www.cnblogs.com/zenny-chen/p/5092933.html
Copyright © 2020-2023  润新知