[英]Why does decay to pointer for array argument appear not to apply to sizeof()?
我之前读过一个因为与此完全重复而被关闭的问题
和
但读完之后我仍然对sizeof()的工作原理感到困惑。 我理解将数组作为参数传递给函数,如
void foo(int a[5])
将导致数组参数衰减为指针。 我在上面的2个问题链接中找不到的是一个明确的答案,为什么sizeof()
函数本身免于(或至少看似豁免)这个指针衰减行为。 如果sizeof()表现得像任何其他函数那么
int a[5] = {1,2,3,4,5};
cout << sizeof(a) << endl;
那么上面应该输出4
而不是20
。 我是否错过了一些明显的东西,因为这似乎与指针行为的衰退相矛盾? 很抱歉再次提起这个问题,但我真的很难理解为什么会发生这种情况,尽管多年来一直很愉快地使用这个功能而没有真正考虑它。
因为标准这样说(强调我的):
(C99,6.3.2.1p3)“ 除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为”array of type“的表达式将转换为带有“指向类型的指针”类型的表达式,它指向数组对象的初始元素,而不是左值。“
请注意,对于C ++,标准明确指出大小是数组的大小:
(C ++ 11,5.3.3p2 sizeof)“[...]当应用于数组时,结果是数组中的总字节数。这意味着n个元素的数组大小是n倍的n倍。元素的大小。“
sizeof
是一个运算符,而不是一个函数。 这也是具体的一个。 如果它是一个表达式,则括号甚至不是必需的:
int a;
sizeof (int); //needed because `int` is a type
sizeof a; //optional because `a` is an expression
sizeof (a); //^ also works
如您所见,它也在这个优先级图表上。 它也是不可重载的运营商之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.