1
#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;
}

この関数で「単項'&'の左辺値が無効です」というエラーが発生するのはなぜですか?通常は正常にswap(&a,&b)動作swap(&a++,&b++)しますが、swap(&(a++),&(b++))エラーが発生します。この背後にある理由は何ですか?

4

1 に答える 1

8

post-increment演算子は、post-increment操作が実行された変数に含まれている以前の値の一時的なバージョンを返します。この一時値は、l値、つまり「名前付き」メモリ位置ではないため、単項アドレス演算子を使用してその一時アドレスを取得することはできません。

たとえば、x86などの特定のアーキテクチャでは、などの単純なPODタイプでポストインクリメント演算子から生成された一時的な値intlong、実際のメモリ位置ではなく、CPUレジスタに一時的に保持されます。このような場合、CPUレジスタの「アドレス」を取得することはできません。

于 2012-10-01T18:26:30.830 に答える