增量运算符不适用于 sizeof

increment operator not working with sizeof

本文关键字:适用于 sizeof 不适用 运算符      更新时间:2023-10-16

只是想知道为什么增量运算符在下面的代码片段中不起作用:

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用于a,但它也可能输出10,这取决于编译器是否足够聪明,可以省略求值a++,推断出int[10]的大小是在编译时计算的。


脚注:可变修改的数组类型也称为 VLA(可变长度数组)类型。简而言之,可变修改类型是 VLA 类型或依赖于 VLA 类型的类型。例如int(*)[a++].

sizeof运算符的操作数未使用,未计算。这是标准行为。

sizeof在C中不是函数。

它的参数并没有真正被计算,只有它的类型是,这是在编译时完成的。 在您的代码中,赋值等效于(在您的体系结构中):

int b = 4

未计算的上下文中,只有类型很重要。调用函数时也会发生同样的情况:

void f();
sizeof(f()); // f not called