以下程序在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));
}
根据这篇Reddit帖子,gcc在这方面不符合标准,因为带括号的表达式不在例外列表中,不会发生从数组到指针的衰减。这个人说得对吗?以下是相关标准引用:
“除非它是
sizeof
运算符或一元&
运算符的操作数,或者是用于初始化字符类型数组的字符字符串字面值,或者是用于初始化元素类型与wchar_t
兼容的数组的宽字符串字面值,否则具有'type'数组类型的lvalue被转换为具有类型'pointer to type'的表达式,该表达式指向数组对象的初始成员且不是lvalue。”只是为了澄清,他认为
(a)
应该触发数组到指针的衰减,因为括号不在上述列表(sizeof
运算符、一元&
运算符、字符串字面值作为初始化器)。
sizeof
是很重要的,括号的存在或缺失是有意义的 - 决定你是否正在获取指针的大小或元素的大小,或者类似于那样的东西。 - Hot Licks