C++ 增量运算符不使用sizeof

C++ 增量运算符不使用sizeof,c++,operators,sizeof,C++,Operators,Sizeof,只是想知道为什么增量运算符在下面的代码段中不起作用: int main() { int a = 10; int b = sizeof(a++); cout<<"a: "<<a<<endl; cout<<"b: "<<b<<endl; return 0; } intmain() { INTA=10; intb=sizeof

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

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

coutsizeof
运算符的操作数未使用,未对其求值。这是标准行为。

sizeof
不求值其参数。它在编译时静态计算参数的大小,而不导致执行任何代码。

sizeof不是C中的函数

它的参数并没有真正计算,只有它的类型是,这是在编译时完成的。 在您的代码中,分配相当于(在您的体系结构中):


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

<>在C++中(至少到C++ 11)没有变化的类型(至少不像C的概念那样),你可以说<代码> new int [a+++ ] /c>使用可变修改的数组类型;但是类型不逃逸到语言的任何其他部分。因此,在C++中,对siZOF的表达式是不被计算的。在C中,如果不影响可变修改数组类型的大小,则不指定表达式是否被计算。例如:

int main()
{
    int a = 10;
    int b = sizeof(int[a++ ? 1 : 1]);
    cout<<"a: "<<a<<endl;
    cout<<"b: "<<b<<endl;
    return 0;
}
intmain()
{
INTA=10;
intb=sizeof(int[a++?1:1]);
cout在未赋值的上下文中,只有类型才重要。调用函数时也会发生同样的情况:

void f();

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

“为什么我对此感到惊讶?”JordValk:“因为你不知道C++?”SBI是的,这是一个可能的原因,如果它不计算参数表达式为什么它是投掷错误,如果我声明变量A是常量的话?“这是在运行时完成的”——真的吗?sieof是编译时运算符,和整个siZeFo()。编译代码之前,将替换为其结果值。请参阅:该代码的预期行为是什么?@EtienDemartel:我猜询问者的预期是a=11,b=10。+1:C++11中,5.3.3p1,“sizeof运算符在其操作数的对象表示形式中产生字节数。操作数可以是一个表达式,它是一个未赋值的操作数(第5条),也可以是一个带括号的type-id。”添加了强调符。但是
a
既用于确定
sizeof(a++)
,也用于以后的输出。
void f();

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