首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在将数组转换为指针的规则中缺少_Alignof?

为什么在将数组转换为指针的规则中缺少_Alignof?
EN

Stack Overflow用户
提问于 2018-08-11 21:16:24
回答 1查看 183关注 0票数 6

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运算符产生其操作数类型的对齐要求。不计算操作数,结果是整数常量。当应用于数组类型时,结果是元素类型的对齐要求。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-11 22:12:02

在C11和C18标准中,_Alignof运算符的类型名称可能是操作数,而不是表达式。来自C11标准草案第6.5.3节:

代码语言:javascript
复制
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。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51803814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档