【发布时间】:2018-08-11 21:16:24
【问题描述】:
C 2011(草案 N1570)6.3.2.1 3 说:
除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是字符串文字用于初始化数组,类型为 ''array of type'' 的表达式被转换为类型为 ''pointer to type'' 的表达式,它指向数组对象的初始元素,不是左值。如果数组对象有注册存储类,则行为未定义。
C 2018 6.3.2.1 3 说:
除非它是 sizeof 运算符的操作数,或一元 & 运算符,或者是用于初始化数组的字符串字面量,具有类型的表达式"array of type" 被转换为类型为 "pointer to type" 的表达式,它指向数组对象的初始元素并且不是左值。如果数组对象有注册存储类,则行为未定义。
为什么后者缺少_Alignof?
C 2018 前言 7 说:
此版本没有大的变化,只是技术上的更正和澄清。
这意味着从数组转换规则中排除 _Alignof 存在一些错误,导致它被删除。但是,应该可以将 _Alignof 应用于数组,正如 C 2018 6.5.3.4 3 所说:
_Alignof 运算符产生其操作数类型的对齐要求。不计算操作数,结果是一个整数常量。当应用于数组类型时,结果是元素类型的对齐要求。
【问题讨论】:
-
对于我偶然遇到的问题,这是一个非常好的问题。 - 恕我直言,委员会应该提供一个附录,至少用几句话来澄清在任何新标准版本中所做的所有更改。
标签: c language-lawyer