2011-10-20 13 views
1

次のコードを持っているし、大丈夫です、割り当ては、私たちは常に使用する2つの等号

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

をしかし、もし変更以下のようにポインタをint型、エラーが上昇するコンパイル。

#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*に 'しばらく(!int型C = getchar関数()= 'Q')'の割り当てである
int* a = (c !=0) 

として解析し、使用して大丈夫*は期待の意味が何であるかに応じて、過言かもしれないですが、それはあなたが第二の例から期待しているように見えるのセマンティクスを生産されていません... –

+0

はい、私はこの上で完全に間違っています。 –

答えて

4

はありません、演算子の優先順位は、2つのコードスニペットの間で変更されていません。次

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は常に1または0になります。

あなたはおそらくしたい:

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

かは多分

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

あなたが実際に行動に優先度を見ています。

!==よりも優先順位が高いです。 *私たちは常に:だから

int* a =c !=0 

bool
関連する問題