ISO/IEC 9899:2011 条款6.5.1——基本表达式
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——基本表达式的更多相关文章
- ISO/IEC 9899:2011 条款3——术语、定义与符号
3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...
- ISO/IEC 9899:2011 条款5——5.2.1 字符集
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
- ISO/IEC 9899:2011 条款6.4.2——标识符
6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier identifier-nondigit identifie ...
- ISO/IEC 9899:2011 条款6.4.3——通用字符名
6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...
- ISO/IEC 9899:2011 条款5——5.1.2 执行环境
5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...
- ISO/IEC 9899:2011 条款4——标准顺从
4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...
- ISO/IEC 9899:2011 条款6——语言
6 语言 6.1 标记法 1.在本条款中所使用的语法标记法.语义类别(非终结符)用斜体字指示,而字面量单词以及字符集成员(终结符)用粗体字指示.跟在一个非终结符后面的冒号(:)引出其定义.在单独的行中 ...
- ISO/IEC 9899:2011 条款6.3——转换
6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...
- ISO/IEC 9899:2011 条款6.5——表达式
6.5 表达式 1.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该 ...
随机推荐
- linux一些配置
ifconfig 查询.设置网卡和ip参数 ifup ens33 启动网卡 ifdown 关闭网卡 systemctl restart/start/stop network 重启.开始.关闭 网络服务 ...
- 小白怎么用最短时间高效的学习Python?
之所以写这篇文章,在标题里已经表达得很清楚了.做技术的人都知道,时间就是金钱不是一句空话,同一个技术,你比别人早学会半年,那你就能比别人多拿半年的钱.所以有时候别人去培训我也不怎么拦着,为什么?因为培 ...
- TODO 竞品分析方法——关于导航评测的一些笔记
参考:移动App性能评测与优化 chapter4讲了地图怎么测,虽然不测地图,但是里面有关竞品分析的部分写得非常好,很多解决方案真的很精彩.记录一下. 我之前的竞品分析测试,通常是很简单的竞品数据层面 ...
- 学underscore在数组中查找指定元素
前言 在开发中,我们经常会遇到在数组中查找指定元素的需求,可能大家觉得这个需求过于简单,然而如何优雅的去实现一个 findIndex 和 findLastIndex.indexOf 和 lastInd ...
- Oracle查询一个命名空间下所有表和视图的表名、字段名、字段类型、字段大小,是否可为NULL,主键和注释信息
使用SQL查询Oracle一个命名空间下所有表和视图的表名.字段名.字段类型.字段大小,是否可为NULL,主键和注释信息. SQL如下,注意需要将'CDFLOOD'更换为您要查询的命名空间: sele ...
- HDU - 3709 - Balanced Number(数位DP)
链接: https://vjudge.net/problem/HDU-3709 题意: A balanced number is a non-negative integer that can be ...
- [TypeScript ] Using the Null Coalescing operator with TypeScript 3.7
The postshows you how to use the null coalescing operator (??) instead of logical or (||) to set def ...
- MySQL中怎么将LIMIT分页优化?
1.语法: *** limit [offset,] rows 一般是用于select语句中用以从结果集中拿出特定的一部分数据. offset是偏移量,表示我们现在 ...
- windows api多线程
windows api多线程 原文地址:https://www.cnblogs.com/flowingwind/p/8452693.html 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行 ...
- Logstash 安装配置使用
一.Windows下安装运行 官网下载,下载与elasticSearch同一个版本,zip格式.Logstash占用内存较大,我在使用的时候cpu一般都是冲到90% 1.CMD直接运行 创建一个基本的 ...