-1

論理演算子が結果に適用される前に、複合論理AND/OR 式の個々の式が最初に評価されるはずではありませんか?次のプログラム++kの条件で untouchedが使用されているのはなぜですか?m = ++i && ++j || ++k

 #include<stdio.h>

 int main()
 {
      int i=-3, j=2, k=0, m;
    m = ++i && ++j || ++k;
    printf("%d, %d, %d, %d\n", i, j, k, m);
    return 0;
}

出力 : -2,3,0,1

しかし、私は出力を期待しています-2,3,1,1

4

5 に答える 5

6

このような判読不能なコードをコーディングすることは避けてください。実際には次のように解析されます

m = (++i && ++j) || ++k;

そのためj >= 0++j条件が常に true になる++kと、&&は近道であり、その後||は近道またはその他であるため評価されません(そのため、正しいオペランドを評価しない場合があります)。

&&は次のように評価されます: 左のオペランドが評価され、それが false の場合はそれが返され、それが true (つまり と等しくない) の場合にのみ、0右のオペランドが評価され、 の評価結果として返され&&ます。同様に||、次のように評価されます。左側のオペランドが評価されます。true (非ゼロ) の場合、||;の結果になります。そうでない場合、右側のオペランドが評価され、||式の結果になります。

特に、if (x > 0 && 20/x < 5)の除算をコーディングするときは、 に対して試行されることはありませんx==0

C & C++ &短絡評価&遅延評価ページのウィキペディアの演算子も読んでください。また、C プログラミングの優れた本を数時間かけて読んでください。

于 2013-04-29T05:35:21.160 に答える
1

論理演算子には短絡評価があります。つまり、式の値が決定されるとすぐに、式の残りの部分は評価されません。

たとえば m = ++i && ++j || ++k; 、この ++i -> true、++j -> true (非ゼロ値) したがってm = true && true || ++k;

今 true && true は true なので

m = true || ++k 

OR 演算子のように、一方が true の場合、もう一方は評価されないため、結果は true になります。

したがって、k はインクリメントされません。

于 2013-04-29T05:37:21.810 に答える
0

m = ++i && ++j || ++k;

上記のコード行は、最初に ++i と ++j を実行し、|| の後に記述されているため ++k を実行しません。(また)

|| の場合、前のステートメントが既に true の場合、論理回路演算子は実行されません。&& の場合は false

したがって、k はそのままです。

于 2013-04-29T05:40:49.383 に答える
0

これは、論理演算子のショートカットです。あなたの場合は operator||です。最初のオペランドがtrueの場合、2 番目のオペランドが結果に影響を与えることは不可能です。2 番目のオペランドが何を生成するかに関係なく、常に true になります。したがって、2 番目のオペランドは評価されません。

&&最初のオペランドが であることが判明した場合、同じことが論理演算子にも当てはまりますfalse。2 番目のオペランドは重要ではありません。結果は常にありfalse、したがって 2 番目のオペランドは評価されません。

于 2013-04-29T05:35:30.313 に答える
0

&&and||は論理演算子であり、それらをコンテキスト外で使用していますが、これは奇妙です (C/C++ では問題ありませんが、Java または C# では型エラーが発生します)。

短絡演算子を発見したところです。それが真であることが「わかっている」場合は、式全体を評価する必要はありません。つまり、i と j はゼロではないため、式が真であることがわかっているため、k を使用して何もする必要はありません。

于 2013-04-29T05:36:09.913 に答える