2011-10-20 46 views
1

下面的代碼,我們總是使用,是正常的,分配有兩個等號

while(int c=getchar() != 'q'); 

如果變化的整數的指針像下面,編譯將上升一個錯誤。

#include <stdio.h> 
int main(){ 
    int* c=0; 
    if(int* a =c !=0) 
    printf("ok"); 
} 

error: cannot convert `bool' to `int*' in assignment 

這裏發生了什麼?似乎優先事項發生了變化。任何人都可以給我一個提示。如果我改變它,它會工作。

#include <stdio.h> 
int main(){ 
    int* c=0; 
    int* a; 
    if((a =c) !=0) 
    printf("ok"); 
} 
+1

'而分配'(INT C =的getchar()= 'Q'!):*我們總是使用並且沒問題*根據預期的語義是什麼可能是多餘的,但是這不會產生你似乎期望從第二個例子中得到的語義... –

+0

是的,我完全錯了。 –

回答

4

不,運算符優先級還沒有到兩個代碼段之間變化。以下內容:

while(int c=getchar() != 'q') 

相當於:

while(int c = (getchar() != 'q')) 

這裏,getchar()被調用時,它的返回值與'q',和比較的結果被存儲在int可變c

換句話說,c不包含剛被讀取的字符;它包含一個布爾指示符,用於說明最近的字符是否爲'q'

由於c從來沒有看過,代碼的作品。但是,這可能不是預期的。

6

由於優先級,while(int c=getchar() != 'q');是錯誤的。它將始終存儲比較由getchar()q返回的值的結果。所以c將永遠是10

你可能想:

int c; 
while((c = getchar()) != 'q'); 
    ^   ^

或許

while((c = getchar()) != EOF && c != 'q'); 
3

你確實看到了行動中的優先。

!=優先於=。所以

int* a =c !=0 

解析爲

int* a = (c !=0) 

這是一個bool的一個int*