8

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

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

输出-

一个:10

乙:4

4

5 回答 5

10

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

于 2012-12-27T16:29:35.740 回答
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 开始),这可能会输出11for a,但也可能会输出10,这取决于编译器是否足够聪明,可以省略评估a++,推断 sizeofint[10]是在编译时计算的。


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

于 2012-12-27T16:31:58.533 回答
2

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

于 2012-12-27T16:29:28.717 回答
1

sizeof 不是 C 中的函数。

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

int b = 4
于 2012-12-27T16:30:42.223 回答
0

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

void f();

sizeof(f()); // f not called
于 2012-12-27T16:36:01.953 回答