2
#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;
}

結果が-220 1になるのはなぜですか?

++ iがゼロ以外であるため、1つのロジックは(++ j && ++ k)は計算されません

ただし、&&の方が||よりも優先度が高いため なぜ計算されないのか

4

4 に答える 4

5

優先順位は、式が評価される順序を指定しません。式の解釈方法を指定します。この場合、C の優先順位規則 (正式な文法に組み込まれている) によりa || b && c、 が として解釈されa || (b && c)ます。

この式が評価されるとき、C の規則は、a最初に評価する必要があることを指定します。規則では、ifaが true の場合、式全体の値が true であり、 の右側||は評価されないとも述べています。

これをより明確に理解するために、次の式を考えてみましょうa + b < c * d。優先順位規則により、これは として解釈され(a + b) < (c * d)ます。ただし、 とは異なり||、C の規則では、 の左側を<最初に評価する必要があるとは指定されていません。よりも優先順位が高くても、コンパイラはa + b最初または最初に評価する場合があります。コンパイラは、正しい答えを得る任意の評価順序を使用できます。c * d*+

ここで課せられる唯一の順序は、を評価する前にa + bc * dの両方を評価する必要があるという<ことです。ただし、それは優先順位のルールではなく、式の構造に由来します。

于 2013-01-10T15:22:30.730 に答える
4

演算子&&||計算の順序は左から右です。||コンパイラは、左のオペランドが true と評価された場合、演算子の右のオペランドが計算されないことを保証します。

于 2013-01-10T15:08:17.060 に答える
1

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

++iが最初に実行されます。以降、iは になります。-2これは と同等/意味しtrueます。++j && ++k一部は実行されず、m値は になります1

したがって、最終出力は次のようになります-2 2 0 1

を実行||すると、左手の部分が最初に実行され、trueそれから右に進みません。trueですから、right-part が であるかであるかは関係ありませんfalse。したがって、あなたの場合、||実行された部分を残し、ゼロ以外の値を返すため、つまりtrue.

于 2013-01-10T15:07:59.700 に答える
1

短絡評価による

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

と同等です

++i;
m = i != 0;
if(!m) {
  ++j;
  m = j != 0;
  if(m) {
    ++k;
    m = k != 0;
  }
}
于 2013-01-10T15:29:19.267 に答える