括号在确定数组的大小时会有所不同吗?

以下程序在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在这方面不是标准一致的,因为当不发生数组到指针衰减时,括号表达式不在异常列表上。

这个人是正确的吗?这里是相关的标准报价:

Except when it is the operand of the sizeof operator or the unary & operator, or is a character string literal used to initialize an array of character type, or is a wide string literal used to initialize an array with element type compatible with wchar_t, an lvalue that has type ‘array of type’ is converted to an expression that has type ‘pointer to type’ that points to the initial member of the array object and is not an lvalue.

为了清楚,他认为(a)应该触发数组到指针衰减,因为括号没有在上面的列表中覆盖(sizeof运算符,一元&运算符,字符串文字作为初始值)。

看似冗余的括号是否影响程序的语义是C标准中一个长期存在的问题,仍然没有得到充分的解决。

通常声明((void *)0)在技术上不是空指针常量,因为没有规则说括号空指针常数是空指针常量。

一些编译器对char s [] =(“abc”);发出一个错误,因为当一个字符数组可以从一个字符串字面量初始化时,该规则不覆盖括号字符串文字。

有很多类似的例子。你找到了其中一个。

从我可以告诉,共识基本上是规则应该是C做什么,但C从来没有正式采纳。 C使得括号表达式在功能上等同于非括号表达式,以及一些明确陈述的例外。这将同时涵盖所有这些问题。

所以技术上,这个人可以被认为是正确的,但它是一个过于严格的解释的标准,没有人真正跟随,因为它是常识,标准是在这里只是错误。

http://stackoverflow.com/questions/30557710/do-parentheses-make-a-difference-when-determining-the-size-of-an-array

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:括号在确定数组的大小时会有所不同吗?