This question already has answers here:
Why does sizeof(x++) not increment x?
(9个答案)
3年前关闭。
考虑请
我期望将
这是怎么回事?这不是测验。这是我在代码中遇到的问题的简化版本。
编辑:我不认为重复在这里有帮助-我的问题是关于sizeof未被评估为可变长度数组。
(9个答案)
3年前关闭。
考虑请
#include <stdio.h>
int main(void) {
int size = 1;
int foo[1];
int bar[size];
int* pfoo = 0;
int* pbar = 0;
printf("%zu %zu\n", sizeof(pfoo = foo), sizeof(pbar = bar));
printf("%p %p\n", pfoo, pbar);
return 0;
}
在https://ideone.com/VeiJXH上运行时的输出为我期望将
pbar
设置为bar
的第一个元素的地址,因为bar
是可变长度数组。我认为sizeof
是在运行时针对可变长度数组进行评估的,这意味着pbar
将为非零。这是怎么回事?这不是测验。这是我在代码中遇到的问题的简化版本。
编辑:我不认为重复在这里有帮助-我的问题是关于sizeof未被评估为可变长度数组。
最佳答案
赋值的类型为“赋值后左操作数的值值”(第6.5.1 / 3节,添加了重点)。对于pbar = bar
,左操作数的值为int*
类型(因为pbar
就是这种类型)。
关于sizeof
运算符,“如果操作数的类型是可变长度数组类型,则对操作数进行求值;否则,不对操作数求值,并且结果是整数常量。” (第6.5.3.4/2节)。如上所述,操作数的类型是int*
,它不是可变长度数组类型。因此没有评估。
以下确实是一个坏主意。但是,它给出了可能发生评估的情况的想法:
printf("%zu\n", sizeof(int[dim = x + y]));
printf("%d\n", dim);
08-17 00:20