c - 为什么 swap(&a++,&b++) 给出错误 "invalid lvalue in unary ' &'"?

标签 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;
}

为什么这个函数会报错“invalid lvalue in unary '&'”? 普通 swap(&a,&b) 工作正常,但 swap(&a++,&b++) 以及 swap(&(a++),&(b++))给出错误。这背后的原因是什么?

最佳答案

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

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

关于c - 为什么 swap(&a++,&b++) 给出错误 "invalid lvalue in unary ' &'"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12678838/

相关文章:

c - 通过 C 中的套接字发送 Server-Sent-Events

c# - C++中指针和C#中引用类型的区别

C++:无法通过传递给查找器函数来重新分配空初始化的对象指针

c - 为什么 printf() 在使用指针时绕过分段失败?

C printf 无符号字符数组

c - getchar() 不等待按下 Enter 键

iphone - 构建在 XCode 中运行的 C 库最终会出现不受支持的架构

java - Java 中的 printf() 功能与 CharBuffer 或类似的东西相结合

c - 可执行文件中的数据位于奇怪的位置

无法修改 malloc() 分配的地址处的值