增量运算符不使用sizeof

use*_*292 8 c++ operators sizeof

可能重复:
为什么sizeof(x ++)不能递增x?

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

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

输出 -

a:10

b:4

sep*_*p2k 10

sizeof不评估其论点.它在编译时静态计算参数的大小,而不会导致执行任何代码.

  • @JanDvorak:因为你不懂C++? (5认同)

Joh*_*itb 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;
}
Run Code Online (Sandbox Code Playgroud)

在C(从C99起),这可以输出11a,但它还可输出10,取决于编译器是否足够聪明省略评估a++,推断出sizeof运算int[10]是在编译时计算的.


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