我知道sizeof
从不计算它的操作数,除非在特定的情况下,所述操作数是VLA。或者,我以为我知道。
void g(int n) {
printf("g(%d)\n", n);
}
int main(void) {
int i = 12;
char arr[i]; // VLA
(void)sizeof *(g(1), &arr); // Prints "g(1)"
(void)sizeof (g(2), arr); // Prints nothing
return 0;
}
怎么一回事?
发布于 2015-06-24 21:06:11
看起来我应该在发帖前三思,因为在我发帖之后我就突然想到了。
我对sizeof
如何与VLA交互的理解实际上是正确的,正如下面的引述所证实的那样(感谢@this !):
6.5.3.4
sizeof
和_Alignof
运算符
如果操作数的类型是可变长度数组类型,则计算该操作数;否则,不计算该操作数,结果为整数常量
这并不是导致这种(对我来说)令人惊讶的行为的原因。
(void)sizeof (g(2), arr);
在VLA子表达式中,逗号运算符会触发arr
的数组到指针的衰减。因此,sizeof
的操作数不再是一个(g(2), arr)
,而是一个普通的char*
,并且它回退到不计算它的操作数。
Apparently在C++中改变了这种行为,逗号运算符将不再衰减数组。
https://stackoverflow.com/questions/31027237
复制相似问题