增量运算符不适用于sizeof [duplicate]

问题描述 投票:8回答:5
只是想知道为什么增量运算符在下面的代码片段中不起作用:

int main() { int a = 10; int b = sizeof(a++); cout<<"a: "<<a<<endl; cout<<"b: "<<b<<endl; return 0; }

输出-

a:10

b:4

c++ operators sizeof
5个回答
10
投票
sizeof不评估其参数。它在编译时静态地计算参数的大小,而不会导致执行任何代码。

8
投票
当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++的评估,从而得出sizeof [ C0]在编译时计算。 


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

2
投票
int(*)[a++]运算符的操作数未使用,未评估。这是标准行为。

1
投票
sizeof不是C中的函数。

它的参数不是真正的求值,只有它的类型是,并且在编译时完成。在您的代码中,分配(在您的体系结构中)等效于:

sizeof


0
投票

未求值上下文中,仅类型重要。调用函数时也会发生同样的情况:

int b = 4
© www.soinside.com 2019 - 2024. All rights reserved.