只是想知道为什么增量运算符不能在下面的代码片段中工作:
int main()
{
int a = 10;
int b = sizeof(a++);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
输出 -
a:10
b:4
答案 0 :(得分:10)
sizeof
不评估其论点。它在编译时静态计算参数的大小,而不会导致任何代码被执行。
答案 1 :(得分:8)
当sizeof的表达式类型不是可变修改的数组类型时,则不计算表达式,因为在编译时类型是完全已知的。 int
没有可变修改的部分。
在C ++中(至少C ++ 11)没有可变修改的类型(至少不像C的概念那样 - 你可以说new int[a++]
使用可变修改的数组类型;但是type不会转义为语言的任何其他部分。特别是,不是sizeof
),所以在C ++中,从不评估sizeof的表达式。在C中,未指定表达式是否在不影响可变修改数组类型的大小时进行求值。例如
int main()
{
int a = 10;
int b = sizeof(int[a++ ? 1 : 1]);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
在C中(从C99开始),这可能会为11
输出a
,但它也可能输出10
,具体取决于编译器是否足够聪明以省略评估{{} 1}},推断在编译时计算了a++
的sizeof。
脚注:可变修改的数组类型也称为VLA(可变长度数组)类型。简而言之,可变修改类型是VLA类型或依赖于VLA类型的类型。例如int[10]
。
答案 2 :(得分:2)
sizeof
运算符的操作数未使用,未进行评估。这是标准行为。
答案 3 :(得分:1)
sizeof不是C中的函数。
它的参数没有真正被评估,只有它的类型是,这是在编译时完成的。 在您的代码中,赋值与(在您的体系结构中)等效:
int b = 4
答案 4 :(得分:0)
在未评估的上下文中,只有类型很重要。调用函数时会发生同样的情况:
void f();
sizeof(f()); // f not called