2017-11-12 3 views
-2

現在、私はcppinstitute.orgでC言語認定コースを受講しています。 クイズの1つに、出力を認識するために以下のような質問があります。C CLA認定試験のオペレータプライオリティ

int i = 1,j= 1; 
int w1,w2; 
w1 = (i>0) && (j<0) || (i<0) &&(j>0); 
w2 = (i<=0) || (j>=0) && (i>=0) || (j<=0); 
printf("%d",w1 == w2); 

プログラムは0を画面に表示する必要がありますが、クイズは印刷1を回答として受け入れると考えています。

私は正しいですか?そうでない場合、私は間違っていますか? 事前に感謝!私は初心者です。

+0

あなたは0を思いついた方法について説明していないので、間違ったと思われるものはわかりません。 –

+2

「0」が正しいと思われます。おそらくクイズに間違いがある、あるいはクイズがここに投稿したものと同じではない –

+2

CのコードがC標準に従って印刷するべきものを印刷するソフトウェアは誰も書いていないのは残念です。例えば、Cコードの実行をシミュレートする何らかの方法しかなければ、答えを理解することができました。 –

答えて

0

ここで、&&は、||演算子よりも高い優先順位です。

ので、

w1 = (i>0) && (j<0) || (i<0) &&(j>0); 
    = 1 && 0 || 0 && 1; 
    = 0 || 0 
    = 0 

そして

w2 = (i<=0) || (j>=0) && (i>=0) || (j<=0); 
    = 0 || 1 && 1 || 0 
    = 0 || 1 || 0 
    = 1 || 0 
    = 1 

ので、w1 == w2は偽になります。したがって、正しい出力は0です。

+0

'w1'を評価する最後の'(j> 0) 'は、短絡のため評価されません。 '(i <0)'はfalseなので、 '&&(j> 0)'の値は結果に影響を与えません(falseです)。評価されません。 –

+0

@JonathanLeffler:標準では、両方のオペランドに関して、 '&&'と '||'または演算子の結果を定義しています。したがって、両方のオペランドの値を使用することは、結果の値を決定するための有効な論理的控除です。ショートカットルールは、その定義の後にのみ記述され、必要でない場合に第2オペランドが評価されないという事実は、副作用が発生するかどうかを判断することにのみ関係します。それは主要な効果に影響を与えません。 –