C 2011年(N1570草案) 6.3.2.1 3说:
除非是运算符、_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则具有类型“类型的数组”类型的表达式将转换为类型“指针到类型”的表达式,该表达式指向数组对象的初始元素,而不是lvalue。如果数组对象具有寄存器存储类,则行为未定义。
C 2018 6.3.2.1 3说:
除非是运算符的操作数,或一元的&运算符,或者是用于初始化数组的字符串文字,否则,具有类型“类型数组”类型的表达式将转换为类型为“指针到类型”的表达式,该表达式指向数组对象的初始元素,而不是值。如果数组对象具有寄存器存储类,则行为未定义。
为什么在后者中缺少_Alignof?
C 2018年前厅7说:
这个版本没有重大变化,只是技术上的修正和澄清。
这意味着豁免_Alignof不受数组转换规则的影响是不正确的,导致它被删除。但是,应该可以将_Alignof应用于数组,如C 2018 6.5.3.4 3所述:
_Alignof运算符产生其操作数类型的对齐要求。不计算操作数,结果是整数常量。当应用于数组类型时,结果是元素类型的对齐要求。
发布于 2018-08-11 22:12:02
在C11和C18标准中,_Alignof运算符的类型名称可能是操作数,而不是表达式。来自C11标准草案第6.5.3节:
Syntax
unary-expression:
postfix-expression
++ unary-expression
-- unary-expression
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-name )
_Alignof ( type-name )
unary-operator: one of
& * + - ~ !sizeof运算符可能有表达式或括号大小的类型名称作为操作数,但由于使用括号大小的类型名称以外的任何东西作为_Alignof的参数是违反约束的,因此这里根本不需要数组转换的特殊异常。
结果表明,N1570草案标准的发布与C11标准的最终发布(ISO/IEC9899:2011)之间发生了变化。在这就是答案中有一些讨论,其中提到了这个Google组线程中的讨论,国际标准化组织委员会的Larry在讨论中建议:
最大的改变是将
_Alignof从一些不应该添加的地方删除(基于错误的概念,即它接受类型或表达式,就像sizeof实际上只接受一个类型):6.3.2.1p2、p3、p4、fn。65;和6.7.1 fn。121。
https://stackoverflow.com/questions/51803814
复制相似问题