我之前读过一个因为与此完全重复而被关闭的问题
和
但读完之后我仍然对sizeof()的工作原理感到困惑.我理解将数组作为参数传递给函数,如
void foo(int a[5])
Run Code Online (Sandbox Code Playgroud)
将导致数组参数衰减为指针.我在上面的2个问题链接中找不到的是一个明确的答案,为什么sizeof()函数本身免于(或至少看似豁免)这个指针衰减行为.如果sizeof()表现得像任何其他函数那么
int a[5] = {1,2,3,4,5};
cout << sizeof(a) << endl;
Run Code Online (Sandbox Code Playgroud)
然后上面应该输出4而不是20.我是否错过了一些明显的东西,因为这似乎与指针行为的衰退相矛盾?很抱歉再次提起这个问题,但我真的很难理解为什么会发生这种情况,尽管多年来一直很愉快地使用这个功能而没有真正考虑它.
oua*_*uah 15
因为标准这样说(强调我的):
(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
Run Code Online (Sandbox Code Playgroud)
如您所见,它也在这个优先级图表上.它也是不可重载的运营商之一.