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. docker版本lnmp

    也不是全部的docker,比如php-fpm,这个可以用docker版. 但第三方插件就不灵活,所以原生的就好. 另外,在建设ftp服务时,以后要弃vsftpd而选用pure-ftp了. pure-f ...

  2. 均分纸牌(Noip2002)

    1320:[例6.2]均分纸牌(Noip2002) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 3537     通过数: 1839 [题目描述] 有n堆纸牌,编 ...

  3. js比较日期大小 判断日期

    使用js的方法来判断两个日期的先后关系,不能正常判断,因此手写了一个方法,如下: //判断开始日期是否大于结束日期,注意,该方法仅仅适用于“2010-01-01”这样的日期格式!   function ...

  4. Django示例演示--?

    引用自:https://blog.csdn.net/weixin_42950386/article/details/83143293 定义模型类 模型类被定义在"应用/models.py&q ...

  5. nmap 排除某端口进行扫描

    --exclude-ports (Exclude the specified ports from scanning) https://nmap.org/book/man-port-specifica ...

  6. [Schematics] 0. Schematics "Hello World"

    1. Install schematics cli: npm i -g @angular-devkit/schematics-cli@latest 2. Then run schematics to ...

  7. ArrayList 集合的几种遍历的方法

    ArrayList 集合  也可称作动态数组(长度可变),在新建的时候是没有默认长度的,在新增数据长度小于10的时候,ArrayList 的长度会自动设置为10 //了解更多可以按住Ctrl 再点击你 ...

  8. k8s-yaml

    apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: ...

  9. Linux Shell 如何获取参数

    $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示 ...

  10. PHP常用的变量检查函数和获取某个变量的类型

    定义变量 $a = 100; 1.gettype($a) #检查变量的类型 输出integer 2.settype($a, 'double') #设置$a变量为double类型 3. is_array ...