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

时间:2012-10-01 18:24:39

标签: c pointers printf swap 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;
}

为什么这个函数会给出错误“unary'中的无效左值'&amp;'”? 普通swap(&a,&b)工作正常,但swap(&a++,&b++)以及swap(&(a++),&(b++))会出错。这背后的原因是什么?

1 个答案:

答案 0 :(得分:8)

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

例如,在某些体系结构(如x86等)上,将暂时保留一个简单的POD类型(如intlong等后增量运算符生成的临时值在CPU寄存器中,而不是实际的内存位置。在这些情况下,您根本无法获取CPU寄存器的“地址”。