x ++和++ x不能在c中留下值(左值)?

bar*_*lpy 0 c c++

偶尔,我一直在问一个有趣的问题:x++++x不能留在C值?很多人告诉我这++x不可能因为++ x的汇编代码没有返回寄存器.我对此表示怀疑.所以我做了一些实验.

c代码:

#include <stdio.h>

int main()
{
    int a = 1;
    a++ = 10; 
    ++a = 10; 
    return a;
}
Run Code Online (Sandbox Code Playgroud)

gcc编译错误:

./test.c:6: invalid lvalue in assignment
./test.c:7: invalid lvalue in assignment
Run Code Online (Sandbox Code Playgroud)

更改代码和程序集:

int a = 1;
int b = a++; 
int c = ++a; 
Run Code Online (Sandbox Code Playgroud)

汇编代码:

0x08048400 <main+0>:    push   %ebp
0x08048401 <main+1>:    mov    %esp,%ebp
0x08048403 <main+3>:    sub    $0x18,%esp
0x08048406 <main+6>:    movl   $0x1,-0x4(%ebp)
0x0804840d <main+13>:   mov    -0x4(%ebp),%eax
0x08048410 <main+16>:   mov    %eax,-0x8(%ebp)
0x08048413 <main+19>:   incl   -0x4(%ebp)
0x08048416 <main+22>:   incl   -0x4(%ebp)
0x08048419 <main+25>:   mov    -0x4(%ebp),%eax
0x0804841c <main+28>:   mov    %eax,-0xc(%ebp)
0x0804841f <main+31>:   mov    -0x4(%ebp),%edx
0x08048422 <main+34>:   mov    %edx,%eax
0x08048424 <main+36>:   jmp    0x8048426 <main+38>
0x08048426 <main+38>:   mov    %ebp,%esp
0x08048428 <main+40>:   pop    %ebp
0x08048429 <main+41>:   ret
Run Code Online (Sandbox Code Playgroud)

似乎++ x和x ++之间的区别只是符合语义.为什么很多人说++ a可以是左值但是++不能?

有些问题我没有得到吗?或者他们只是胡说八道?

在读完Keith Thompson的答案之后,我想在c ++,x ++中当x是用户定义类型导致postfix operator ++的实现(它返回一个临时对象),所以x ++不能是左值.

#include <iostream>
using namespace std;

class my_test
{
        int a;

public:
        void printf()
        {   
                cout << a << endl;
        }   


        my_test(int c)
        {   
                a = c;
        }    


        my_test& operator++()
        {   
                ++a;
                return *this;
        }   


        my_test& operator++(int)
        {   
                my_test temp(a);
                ++a;
                return temp;
        }   
};



int main(int argc, char **argv)
{
        int a = 10; 
        int b = ++a;
        int c = a++;

        my_test obj1(1);
        my_test obj2(2);

        obj1++ = obj2;
        ++obj1 = obj2;

        obj1.printf();
        obj2.printf();

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用g ++(版本:g ++(GCC)4.4.7 20120313(Red Hat 4.4.7-17))编译代码,只是得到一个警告消息.

[root@localhost ~]# g++ -g3 ./1.cpp -O0
./1.cpp: In member function 'my_test& my_test::operator++(int)':
./1.cpp:30: warning: reference to local variable 'temp' returned
[root@localhost ~]# 
Run Code Online (Sandbox Code Playgroud)

似乎在c ++,++ x和x ++中都可以是左值?

Kei*_*son 7

该术语是左值,而不是"左值".

在C中,既不是左值x++也不++x是左值.这是因为语言以这种方式定义它; 它与汇编代码没有任何关系.

(在C++中,它++x是一个左值而x++不是.也许是你混淆的根源.)

(你已经更新了你的问题,询问++C++中的重载运算符.我已经回答了原来的问题.如果你有一个关于不同语言和不同规则的新问题,请单独发布.)