int main()
{
int a = 10;
int b = sizeof(a++);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
输出-a:10
b:4
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]
。
int(*)[a++]
运算符的操作数未使用,未评估。这是标准行为。它的参数不是真正的求值,只有它的类型是,并且在编译时完成。在您的代码中,分配(在您的体系结构中)等效于:
sizeof
未求值上下文中,仅类型重要。调用函数时也会发生同样的情况:
int b = 4