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. mysql存储、function、触发器等实例

    一.创建数据库&表 DROP DATABASE IF EXISTS security; CREATE database security; USE security; CREATE TABLE ...

  2. Django - 读取Excel文件

    目录 返回Django目录 返回随笔首页 没么多事儿,来看示例: 前端重要代码. <div class="row"> <div> <form acti ...

  3. django知识点回顾

    1.web应用 本质是基于socket实现的应用程序 浏览器-----------服务器 2.http协议:应用层协议 1.基于TCP协议 2.基于请求响应 3.短连接 4.无状态保存(引入了cook ...

  4. Centos6 克隆后简单的网络配置

    第一步:修改主机名 $ vi /etc/sysconfig/network     第二步: $ vi  /etc/udev/rules.d/70-persistent-net.rules   注: ...

  5. eclipse更改jdk版本(1.6》1.7 以此类推)

    电脑装了两个版本的JDK,在开发项目的时候默认使用的是高版本的,但是公司又要求用低版本的JDK来编译,肿么办???么事,小编这就来给你支招! eclipse 安装两个版本的JDK 1 打开eclips ...

  6. C#延迟初始化Lazy<T>

    1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...

  7. 011——MATLAB清除工作控件变量

    (一):参考文献:https://zhidao.baidu.com/question/234530287.html 清除当前工作空间全部变量:clear: 清除当前工作空间某些变量:clear 变量名 ...

  8. sql server 视图的用法

    Sql server中 如何用sql语句创建视图 1.视图的作用 视图的作用: 第一点:使用视图,可以定制用户数据,聚焦特定的数据. 解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例 ...

  9. PHP操作数据库(以MySQL为例)

    一.开启扩展配置: 在php.ini的extension板块中增加一行extension=php_mysqli.dll 重启PHP,在phpinfo查看 <?php echo phpinfo() ...

  10. svg坐标转换

    本文内容转自 how-to-translate-from-dom-to-svg-coordinates-and-back-again svg coordinate system Why we need ...