增量运算符不使用sizeof

时间:2012-12-27 16:28:26

标签: c++ operators sizeof

  

可能重复:
  Why does sizeof(x++) not increment x?

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

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

输出 -

a:10

b:4

5 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:8)

当sizeof的表达式类型不是可变修改的数组类型时,则不计算表达式,因为在编译时类型是完全已知的。 int没有可变修改的部分。

在C ++中(至少C ++ 11)没有可变修改的类型(至少不像C的概念那样 - 你可以说new int[a++]使用可变修改的数组类型;但是type不会转义为语言的任何其他部分。特别是,不是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,具体取决于编译器是否足够聪明以省略评估{{} 1}},推断在编译时计算了a++的sizeof。


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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

sizeof不是C中的函数。

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

int b = 4

答案 4 :(得分:0)

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

void f();

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