只是想知道为什么增量运算符在下面的代码片段中不起作用:
int main()
{
int a = 10;
int b = sizeof(a++);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
输出-
一个:10
乙:4
sizeof
不评估其论点。它在编译时静态计算参数的大小,而不会导致任何代码被执行。
当 sizeof 的表达式类型不是可变修改的数组类型时,则不计算表达式,因为该类型在编译时是完全已知的。int
没有可变修改的部分。
在 C++ 中(至少 C++11)没有可变修改的类型(至少不像 C 的概念那样 - 你可以争辩说new int[a++]
使用可变修改的数组类型;但该类型不会转义到任何其他部分语言的. 特别是, 不是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
for a
,但也可能会输出10
,这取决于编译器是否足够聪明,可以省略评估a++
,推断 sizeofint[10]
是在编译时计算的。
脚注:可变修改数组类型也称为 VLA(可变长度数组)类型。简而言之,可变修改类型是一种类型,它要么是 VLA 类型,要么是依赖于 VLA 类型的类型。例如int(*)[a++]
.
运算符的操作数sizeof
未使用,未计算。这是标准行为。
sizeof 不是 C 中的函数。
它的参数没有真正评估,只有它的类型是,这是在编译时完成的。在您的代码中,分配等效于(在您的体系结构中):
int b = 4
在未评估的上下文中,只有类型很重要。调用函数时也会发生同样的情况:
void f();
sizeof(f()); // f not called