在定义整型常量表达式时间接禁止(或不禁止)运算符(在C中)
在标准C(C99/C11)中,我们有所谓的整数常量表达式,这些常量表达式的操作数都是常量整数 以下定义适用: 标准C99第6.6节(第6段): 整数常量表达式)应为整数类型,且 仅具有整数余项、枚举常量、, 字符常量,sizeof表达式,其结果为整数 常量和作为的直接操作数的浮点常量 演员 这出现在更一般的常量表达式的定义之后在定义整型常量表达式时间接禁止(或不禁止)运算符(在C中),c,syntax,c99,language-lawyer,C,Syntax,C99,Language Lawyer,在标准C(C99/C11)中,我们有所谓的整数常量表达式,这些常量表达式的操作数都是常量整数 以下定义适用: 标准C99第6.6节(第6段): 整数常量表达式)应为整数类型,且 仅具有整数余项、枚举常量、, 字符常量,sizeof表达式,其结果为整数 常量和作为的直接操作数的浮点常量 演员 这出现在更一般的常量表达式的定义之后 (由于整数常量表达式是在常量表达式之后定义的,因此我假设前者是最后一个表达式的特例。) 另一方面,条件表达式被视为常量表达式,受以下规则约束: 标准C99,第6.6节:
(由于整数常量表达式是在常量表达式之后定义的,因此我假设前者是最后一个表达式的特例。) 另一方面,条件表达式被视为常量表达式,受以下规则约束: 标准C99,第6.6节: 常量表达式不得包含赋值、增量、, 减量、函数调用或逗号运算符,除非 包含在未计算的子表达式中 通过展开条件表达式的含义,我们可以归纳为后缀表达式和/或一元表达式 现在,如果我们将这些约束应用于整型常量表达式,我们大致可以得到它们由条件表达式组成,条件表达式的限制方式是:每个操作数都是整型/枚举/字符常量(或紧跟在强制转换之前的浮点常量),并且没有赋值、增量、,减量、函数调用或逗号运算符
- 简单地说,让我们假设E是这样一个表达式,没有任何
运算符,也没有未计算的操作数李>sizeof
在E中是否间接禁止以下操作员:
(地址)和
(间接)*
(数组下标)[]
(结构成员)
(指向结构成员的指针)->
- 如果F是E的整数常量子表达式,则F根据定义具有整数类型
李>T
- 如果一元运算符
出现在E中的F之前,则&F在具有“指向T的指针”类型的操作数中,这在E中是不允许的(尽管如此,F不是对象,而是一个整数值,因此&
&code>无法应用)。因此,
不能出现在任何E中李>&
- 由于F没有任何指针类型,因此表达式
没有意义李>*F
- 下标运算符
用于指示数组中的元素。这意味着我们在E中会有类似[]
的内容。这里,A[N]
必须是整数常量表达式。但是我们注意到,N
也是一个操作数,但它是A
类型的对象,这在E中是不允许的。这意味着数组下标运算符不能出现在E中数组
- 如果我们在E中有操作符
和
,这意味着它们在E中使用,如下所示:->
。因此,我们有操作数S.memb pS->memb
,其类型为S
或struct
和union
,后者是指向struct或union的pS
指针。但是E中不允许使用此类“操作数”李>
- 在E中不允许使用复合文本,因为它们是左值,这意味着在程序运行时它们将有一个地址。由于编译器无法知道这样的地址,因此包含复合文字的表达式不被视为常量李>
- 由于F没有任何指针类型,因此表达式
您是否知道例外情况,其中一些运算符或表达式可以是整型常量表达式的[部分](如我表示E的受限情况) ICE只需要有值(行话中的右值)作为构成它的主要表达式,而不需要对象(左值) 如果你从这里开始排除操作符,你会看到
- 任何需要左值作为操作数的运算符都不能使用(赋值、递增、递减、一元
)&
- 生成左值的运算符都不能使用(一元
、数组成员*
、成员[]
)->
- 需要将
结构作为参数的
运算符,因为struct
- 复合文字用词不当,它们是对象
- 也不允许函数调用
\u Alignof
、宏偏移量和大小的某些外观,你是在开玩笑吧?你写信了吗