2012-10-01 20 views
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 ++)給出錯誤「一元中的無效左值&&」?

+1

這是一種語言限制。同樣,你不能寫'&(a + 1)' –

回答

8

後增量操作符返回執行後增量操作的變量中包含的先前值的臨時版本。這個臨時值不是一個l值或「已命名」的內存位置,因此您不能使用一元尋址操作符來獲取臨時地址。例如,在x86等的某些體系結構中,從簡單POD類型(如int,long等)上的後增加運算符生成的臨時值將臨時保存在CPU寄存器中,而不是實際的內存位置。在這些情況下,您根本無法獲取CPU寄存器的「地址」。

+0

+1但是你的第二段並不真正相關。即使是一個有名的左值也不需要是存儲位置,並且可以僅僅是一個寄存器值(特別是根據優化)。但是一旦你接受了它的地址,它就會被放入記憶中(或者甚至不是那樣,取決於上下文)。 –

+0

你是男人傑森,尼斯回答.. :)。投票的感謝.. :) – Whoami

+0

我只是試圖給出一個簡單的情況,爲什麼會這樣...優化顯然可以彈性規則一點,但正如你最後指出的,一個命名的內存位置將必須以某種方式與給定的內存位置相關聯,而不是在使用地址 - 運算符時與CPU寄存器關聯。 – Jason

相關問題