为什么交换(&a ++,&b ++)会出现错误"unary'和''中的无效左值?

Raj*_*Raj 1 c printf swap pointers memory-address

#include<stdio.h>
int swap(int *a,int *b);
int main()
{
    int a=10,b=20;
    swap(&a++,&b++);
    printf("a=%d\nb=%d",a,b);
    return 0;
}

int swap(int *a,int *b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
Run Code Online (Sandbox Code Playgroud)

为什么这个函数会给出错误"一元中的无效左值"和"?"?正常swap(&a,&b)工作正常,但swap(&a++,&b++)也有swap(&(a++),&(b++))错误.这背后的原因是什么?

Jas*_*son 8

后增量运算符返回包含在执行增量后操作的变量中的先前值的临时版本.此临时值不是l值或"命名"内存位置,因此您无法使用一元address-of运算符获取该临时值的地址.

例如,在某些体系结构等的x86,等,从递增运算符在一个简单的POD型像生成的临时值int,long等等,将被暂时在一个CPU寄存器,而不是实际的存储器位置保持.在这些情况下,您根本无法获取CPU寄存器的"地址".