6.5.1 基本表达式

语法

1、primary-expression:

identifier

constant

string-literal

(    expression    )

generic-selection

语义

2、一个标识符是一个基本表达式,提供为,它作为指派一个对象(在这种情况下,它是一个左值)或一个函数(在这种情况下,它是一个函数指派符)而被声明。[注:从而,一个未声明的标识符是对此语法的违反。][译者注:比如:

int a = ;
a; // 这是一个基本表达式

3、一个常量是一个基本表达式。其类型依赖于其形式和值,在6.4.4中详细描述。

4、一个字符串字面量是一个基本表达式。它是具有在6.4.5中所描述的类型的一个左值。[译者注:即,一个字符串字面量具有地址。]

5、一个括号表达式是一个基本表达式。其类型和值与相应没用括号的表达式的一样。它是一个左值、一个函数指派符,或是一个void表达式,如果没用括号的表达式分别是一个左值、一个函数指派符,或是一个void表达式的话。

6、一个泛型选择是一个基本表达式。其类型与值依赖于被选中的泛型关联,在以下子条款中详细描述。

6.5.1.1 泛型选择

语法

1、generic-selection:

_Generic    (    assignment-expression  ,  generic-assoc-list    )

generic-assoc-list:

generic-association

generic-assoc-list  ,  generic-association

generic-association:

type-name  :  assignment-expression

default  :  assignment-expression

译者注:其中,表示一个assignment-expression赋值表达式,在6.5.16中介绍。然而,这里的assignment-expression也可以是一个基本表达式,比如一个标识符或常量。]

 

限制

2、一个泛型选择应该最多含有一个default泛型关联。在一个泛型联合中的类型名应该指定一个完整的对象,而不是一个可变修改的类型。在同一泛型选择中的任意两个泛型关联不应该指定相兼容的类型。一个泛型选择的控制表达式应该具有与在其泛型关联列表中命名的最多一个类型相兼容的类型。如果一个泛型选择不具有default泛型关联,那么其控制表达式应该恰好具有一个在其泛型关联列表中命名的一个类型相兼容的类型。[译者注:这里的控制表达式即圆括号中的assignment-expression。]

3、一个泛型选择的控制表达式不被计算。如果一个泛型选择具有一个泛型关联,其类型名与控制表达式的类型相兼容,那么该泛型选择的结果表达式就是那个泛型关联中的表达式。否则,该泛型选择的结果表达式为default选择关联中的表达式。然后,该泛型选择中的所有其它泛型关联都不会被计算。[译者注:这里所谓的表达式不会被计算,并不意味着编译器不做语法判断,只是说表达式不会被执行,比如以下代码:

_Generic(, int: , float:0.34 & 1.25);    // 编译器错误
_Generic(, int: , float:0.34 * 1.25); // OK,0.34 * 1.25不会被执行

上面一行代码中,表达式0.34 & 1.25尽管不会被执行,也不会生成相应的目标代码,但是它并不符合按位与操作符的语法(按位与操作符的操作数不允许是浮点数),因此在编译时仍然会报错。而第二行代码没有问题,同时0.34 * 1.25这个表达式相关的目标代码也不会被生成。

]

4、一个泛型选择的类型和值对于其结果表达式是一样的。它可以是一个左值、一个函数指派符,或是一个void表达式,如果其结果表达式分别为一个左值、一个函数指派符,或是一个void表达式。

5、例  cbrt类型泛型宏可以如下实现:

#define cbrt(X)    _Generic((X),                   \
long double: cbrtl, \
default: cbrt, \
float: cbrtf, \
) (X)

译者注:上述由泛型表达式所返回的结果表达式为cbrtl、cbrt或cbrtf函数指派符,它们被自动转换为函数指针。]

ISO/IEC 9899:2011 条款6.5.1——基本表达式的更多相关文章

  1. ISO/IEC 9899:2011 条款3——术语、定义与符号

    3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...

  2. ISO/IEC 9899:2011 条款5——5.2.1 字符集

    5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...

  3. ISO/IEC 9899:2011 条款6.4.2——标识符

    6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier    identifier-nondigit identifie ...

  4. ISO/IEC 9899:2011 条款6.4.3——通用字符名

    6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...

  5. ISO/IEC 9899:2011 条款5——5.1.2 执行环境

    5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...

  6. ISO/IEC 9899:2011 条款4——标准顺从

    4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...

  7. ISO/IEC 9899:2011 条款6——语言

    6 语言 6.1 标记法 1.在本条款中所使用的语法标记法.语义类别(非终结符)用斜体字指示,而字面量单词以及字符集成员(终结符)用粗体字指示.跟在一个非终结符后面的冒号(:)引出其定义.在单独的行中 ...

  8. ISO/IEC 9899:2011 条款6.3——转换

    6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...

  9. ISO/IEC 9899:2011 条款6.5——表达式

    6.5 表达式 1.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该 ...

随机推荐

  1. Luogu P1970 花匠

    Luogu P1970 花匠 本质上就是找最长的波浪序列. 因为考虑到第一个必选,所以可以让$lst=h[1]$. 此外,注意到$n=1$是要特判,其他情况下显然$ans\geq 2$,所以把$dir ...

  2. Yum下载rpm包、不分析依赖关系强制安装

    在安装包后面加两个参数 --nodeps --force 如下: [root@sh158-xen data]#rpm -ivh MySQL-server-5.5.24-1.linux2.6.x86_6 ...

  3. 1211 BBS后台管理文章添加

    目录 昨日内容回顾 侧边栏inclusion_tag inclusion_tag的响应 使用 自定义inclusion_tag,标签,过滤器 文章的点赞点踩 前端 后端 校验规则 文章的评论功能 1. ...

  4. 大数据之路week07--day07 (Sqoop 从mysql增量导入到HDFS)

    我们之前导入的都是全量导入,一次性全部导入,但是实际开发并不是这样,例如web端进行用户注册,mysql就增加了一条数据,但是HDFS中的数据并没有进行更新,但是又再全部导入一次又完全没有必要. 所以 ...

  5. CH6803 导弹防御塔

    6803 导弹防御塔 0x60「图论」例题 背景 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛l ...

  6. 十三.Java使用Protobuf3

    为什么使用Protobuf? 本教程翻译自谷歌开发者官网,原文地址:https://developers.google.com/protocol-buffers/docs/javatutorial.开 ...

  7. tcp三次握手,四次挥手的形象类比图

  8. spring mvc 坑之PUT,DELETE方法接收不到请求参数

    https://www.cnblogs.com/roobtyan/p/9576685.html 原因: Tomcat处理参数的问题: 1.将请求体中的数据,封装成一个map    2.request. ...

  9. 013——MATLAB硬件支持包离线下载

    (一)参考文献:https://blog.csdn.net/hyperorbit/article/details/88095384 (二)去下列网址下载离线包下载工具:https://ww2.math ...

  10. mongoDB线上数据库连接报错记录

    报错信息提示:无法在第一次连接时连接到服务器 别的一切正常,经过查询得知,是因为如果电脑没设定固定IP,并且重启情况下可能会导致IP地址更改. 解决方法: 将本机ip地址添加到cluster的白名单即 ...