为什么sizeof int是错误的,而sizeof(int)是正确的
Why sizeof int is wrong, while sizeof(int) is right?
我们知道sizeof
是用于计算任何数据类型和表达式大小的运算符,当操作数是表达式时,可以省略括号。
int main()
{
int a;
sizeof int;
sizeof( int );
sizeof a;
sizeof( a );
return 0;
}
sizeof
的第一个用法是错误的,而其他则是对的。
使用GCC编译时,将提供以下错误消息:
main.c:5:9: error: expected expression before ‘int’
我的问题是为什么C标准不允许这种操作。sizeof int
会引起任何歧义吗?
以下可能是模棱两可的:
sizeof int * + 1
是(sizeof (int*)) + 1
,还是(sizeof(int)) * (+1)
?
显然,C语言可能引入了解决歧义的规则,但是我可以想象为什么它没有打扰。使用它的语言,类型的指定符在表达式中从未出现"裸",因此无需规则解决第二个*
是类型还是算术操作员的一部分。
现有的语法确实已经解决了sizeof (int *) + 1
的潜在歧义。它是 (sizeof(int*))+1
,不是 sizeof((int*)(+1))
。
c 有一个类似的问题,可以通过功能风格的铸造语法解决。您可以编写int(0)
,并且可以编写typedef int *intptr; intptr(0);
,但是您不能编写int*(0)
。在这种情况下,分辨率是"裸"类型必须是一个简单的类型名称,它不能只是任何可能具有空格的旧类型ID,也不只是标点符号。也许sizeof
可以通过相同的限制来定义,我不确定。
来自C99标准
6.5.3.4.2
sizeof
操作员产生其操作数的大小(字节),这可能是表达式或括号的名称 类型。
在您的情况下, int
既不表达也不是括号的名称。
使用两种方法可以使用C中的大小。语法是:
C11 6.5.3 Unary operators
...
sizeof unary-expression
sizeof ( type-name )
每当您使用类型作为操作数时,就必须通过语言的语法定义具有括号。如果您在表达式上使用sizeof,则不需要括号。
C标准给出了一个这样的示例,说明您可能想在expression上使用它:
sizeof array / sizeof array[0]
但是,为了一致性,为了避免与操作员优先相关的错误,我个人建议始终使用()无论情况如何。
- sizeof(size_t) 可以小于 sizeof(int) 吗?
- 在 <char>sizeof(int) == 1 的平台中如何编码 char_traits::eof() ?
- 如何理解"vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) )"?
- sizeof(int(123)) 是什么意思?
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- x = malloc(n * sizeof (int));无法将 void 转换为 int
- 如何解释sizeof(std::vector<int>)的值?
- 为什么sizeof int是错误的,而sizeof(int)是正确的
- "new int[5]"和"malloc(5 * sizeof(int))"之间的C++有什么区别?
- C/C++:在32位机器上的sizeof(short)、sizeof(int)、sizeof(long)、size of
- C/C++:包含 int 和枚举的 typedef 结构的大小 == sizeof(int)
- 为什么 sizeof(int) 与 sizeof(int*) 不同
- 如何理解"C++ allows sizeof(char*) != sizeof(int*)"?
- 在这种情况下,sizeof(int) 返回什么
- 在32位或64位平台上,sizeof(int)=1
- sizeof类,在C++中有int,function,virtual函数
- 将-1移位到sizeof(int)在C++中生成两个不同的结果
- sizeof(int)是否始终等于sizeof(void*)
- 为什么C#中的sizeof(int*)=8,C++中的sizeof[int*]=4
- 当sizeof(int)=sizeof(long)时,long优于int的任何情况