2014-11-04 47 views
2
int main() 
{ 
    int a=10; 
    int *b=&a; 
    int c=*b++; 
    printf("%d",c); 
} 

我根據優先級表,該表給出了操作者的http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm優先),修復後知道以下方案產出10.but ++的優先級高於=和*。所以++應該首先評估,然後*。然後爲什麼程序打印輸出爲10?關於*(星號)的混亂和++在C

+0

也許你打算試試這個:int c =(* b)++;'(打印10)與'int c = ++(* b);'(打印11)。在這兩種情況下,'a'都變爲11. – JS1 2014-11-04 20:44:36

回答

3

它具有更高的優先級,這意味着指針將增加1,而不是它指向的值。

但是,增加一個排序到評估結束(這是postfix ++所做的,並且與優先級沒有直接關係),所以您從指針中獲得的值是舊值: p不是p+1。有了這個指針,你可以對它進行解引用並得到a的值,即10。然後指針p增加1。

int c = *p ; 
p++ ; 
0

++的優先級高於*意味着操作數b將結合++首先作爲

int c = *(b++); 

它不會在該評價b++第一和然後解除引用的評價值的任何方式的意思。 在*b++,++b的影響與後增量運算符相同。 *b++很簡單:取消原始值b並將指針b增加1

0

正如你所說,++*更高的優先級。所以int c=*b++;解析爲int c=*(b++);。但是,增量後運算符的結果是在遞增之前的值。換句話說,分配相當於

int temp = b; 
b = b + 1; 
c = *temp; 
+0

賦值也可能等價於'int temp = b; c = * temp; b = b + 1;'。 – haccks 2014-11-04 18:52:59

+0

@haccks當然可以。我認爲,由於前兩行相當於後期增量,所以我在當前的情況下寫得更清楚。您版本中缺乏接近度會模糊此問題。 – 2014-11-04 18:58:48

0

++將在更大的表達式的上下文做的b增量,存儲器地址,評估後。

http://msdn.microsoft.com/en-us/library/e1e3921c.aspx

重要的是要注意,增加或減少後綴表達式計算爲相應的操作員的應用之前的表達式的值是重要的。在評估操作數後發生遞增或遞減操作。只有在較大表達式的上下文中發生後綴增量或減量操作時纔會出現此問題。

那麼,什麼情況是,你應用修訂後的增量b,但是提領*給出的b原始值,它指向10。如果您要打印出b*b,則會看到價值和地址已更改爲意想不到的情況。

0

是的,++的優先級高於*。 所以,聲明

int c=*b++; 

將被評估爲

int c=*(b++) 

因爲它是修復後的運營商,指針「B」先增加,但它返回「B」的舊地址(指向存儲值10)。因此,c的值爲10.