【发布时间】:2015-08-13 23:32:09
【问题描述】:
以下程序在 gcc 4.8.2 上两次打印相同的数字:
#include <stdio.h>
int main()
{
char a[13];
printf("sizeof a is %zu\n", sizeof a );
printf("sizeof(a) is %zu\n", sizeof(a));
}
根据this reddit post,gcc 在这方面不符合标准,因为当数组到指针衰减不发生时,括号中的表达式不在例外列表中。
这个人说的对吗?以下是相关的标准报价:
除非它是
sizeof运算符或一元&运算符的操作数,或者是用于初始化字符类型数组的字符串文字,或者是用于初始化数组的宽字符串文字与wchar_t兼容的元素类型,具有“类型数组”类型的左值将转换为具有“类型指针”类型的表达式,该类型指向数组对象的初始成员并且不是左值。
为了清楚起见,他认为 (a) 应该触发数组到指针的衰减,因为上面的列表中没有包含括号(sizeof 运算符,一元 & 运算符,字符串文字作为初始化器)。
【问题讨论】:
-
不,那家伙很糊涂
-
用他自己的话说,我同意终端困惑
-
我已经有 15 年没有处理这个问题了,但我绝对记得我认为
sizeof的一个场景,其中是否存在括号很重要——确定是否您正在获取指针的大小或元素的大小,或类似的东西。 -
现在我很困惑。该代码的确切目的是什么?你期望从你的 sizeof 表达式中得到什么?数组的长度?但你知道的。一个字符的大小?那为什么不 sizeof (char) 呢?指针的大小,因为数组基本上是指针?
-
@jamesqf 我想知道将数组放入括号是否会触发数组到指针的衰减。
标签: c arrays language-lawyer sizeof parentheses