3

コード:

#include<stdio.h>
int main()
{
    int j = 7, i = 4;
    j = j || ++i && printf("you can");
    printf("%d %d",i,j);
    return 0;
}

出力:4 1

[コードリンク][1]

  1. プレフィックス演算子の優先順位は、論理演算子よりも高くなります。2.&&論理は論理よりも優先され||ます。
  2. 論理AND(&&)では、最初のオペランドが2番目よりもfalseと評価された場合は評価されず、論理OR(||)1番目のオペランドがと評価されたtrue場合、2番目は評価されません。
  3. 完全な式はに評価されているtrueため、jは1です。

疑問:

  1. ここで最初のルールに従わないのはなぜですか?それは正しいべきではありませんか?

    j=(j||((++i) &&printf("you can")));
    

したがって、ステートメントの値はi5になります。printf

ここで一般的な優先順位の規則に違反しているのはなぜですか?結合性は、2つの演算子の優先順位が同じ場合に機能します。コンパイラは最初に評価するかどうかを確認するべきではありません||&&

が最初に評価された場合||、これは私の知識によるものではないはずですが、結果は正しいです。ただし、最初に評価されない場合は、can51を印刷する必要があります。

4

4 に答える 4

4

この式では:

j = j || ++i && printf("you can");

の後にシーケンスポイントがあり||、左から右に評価されます。jはゼロ以外であるため、式の残りの部分は評価されません。したがって、j || (....)1であるtrueになります。isは++i評価されないため、iは4のままです。したがって、出力は4, 1です。

C標準から:

附属書C

—次の演算子の最初のオペランドの終わり:論理積&&(6.5.13); 論理OR|| (6.5.14); 条件付き?(6.5.15); カンマ、(6.5.17)。

あなたjがゼロだった場合、++i && printf("you can")評価されiて5になり、you can印刷されます。++の優先順位が||より大きいことについては正しいですが、シーケンスポイントがあるため、j||最初に評価されます。

于 2012-09-24T16:47:40.683 に答える
3

j || ++i && printf("you can")で表されるtrueと評価されます1。これはORであり、jはゼロ以外であるため、ORの左側のみが評価され、++iおよびprintfは評価されません。したがってj、1でありi、4のままです。

もちろん、実際のコードがそのようなことをすべて行うべきではありません。常に操作の順序が明らかな方法でコードを記述する必要があります。また、ORステートメントに副作用のあるコードを含めることはほとんどありません。

于 2012-09-24T16:38:13.820 に答える
2

あなたがここに持っているもの:

j = j || ++i && printf("you can");

論理式です(数学は発生しません)。それを分解しましょう:

++i                // as a mathematical expression this is i=i+1 (5 in your case)
printf("you can"); // printf returns the number of chars written, (7)

したがって、これは次のようになります。

j = 7 || 5 && 7;

上記の式の出力は単純に1です。したがって、これを実行しても、が表示されるはずj=1です。printf()では、出力が表示されないのはなぜですか?その理由は、式全体が実行されなかったためです。する必要はありません。検討:

result = TRUE || (anything else);

「真」であるか、他のものと同じであるものはすべて、常に真を返します。コンパイラーはこれを知っており、それを確認すると、「私は十分に知っているので、jをtrueに設定して次に進みます」と7 ||同等になります。true ||

これが、式がiをインクリメントせず、「できる」と出力されない理由です。式を反転すると、次のようになります。

j = ++i && printf("you can") || j; 

ロジックは同じままですが、コンパイラは||を認識しません。他のすべてが評価されるまで、iがインクリメントされ、printfが表示されます。

于 2012-09-24T17:08:48.783 に答える
1

私はこのプログラムを2つの方法で実行しました。

j = j || ++i && printf("you can");

次に、このように:

j = j || (++i && printf("you can"));

両方の出力はでした4 1。それらを実行する前は、論理和または論理和の左から右への結合性により、両方からまったく同じ結果が得られると期待していました。式全体は、左から右に関係なく評価されます。括弧の役割は、式が1つの式として評価されることを保証することであり、必ずしもそれが評価される最初の式になることを意味するわけではありません。これについてさらに証拠が必要な場合は、簡単なことを試してください。

j = 1 || (++i);

(++i)括弧内にありますが、評価されることはありません。繰り返しますが、左から右への結合性のためです。

于 2012-09-24T17:29:32.967 に答える