3

このCプログラムの出力はどうあるべきですか?

#include<stdio.h>
int main(){
  int x,y,z;
  x=y=z=1;
  z = ++x || ++y && ++z;
  printf("x=%d y=%d z=%d\n",x,y,z);
  return 0;
}

与えられた出力は次のとおりです。x=2y = 1 z = 1
xの出力は理解できますが、yとzの値がどのようにインクリメントされないかがわかりません。

4

2 に答える 2

12

これは短絡評価の結果です。

++xはに評価され2、コンパイラは、それが何であっても2 || anything常に( "true")に評価されることを認識しています。したがって、評価に進まず、との値は変化しません。1anythinganythingyz

で試してみるなら

x=-1;
y=z=1;

コンパイラはORの右辺を評価して式の結果を決定する必要があるため、これが表示yれ、インクリメントされます。z

編集: asaerlは最初にコメントであなたのフォローアップの質問に答えたので、私は彼の正しい答えを少し拡張します。

演算子の優先順位は、式を構成する部分がどのように結合するかを決定します。ANDはORよりも優先順位が高いため、コンパイラはあなたが書いたことを認識します

++x || (++y && ++z)

それ以外の

(++x || ++y) && ++z

これにより、との間でORを実行する必要が++xあり++y && ++zます。この時点で、通常、どちらか一方の式を最初に評価するかどうかを自由に選択できます(標準に従って)。通常、特定の順序に依存することはできません。この順序は、演算子の優先順位とは関係ありません。

ただし、特に||、標準では、短絡が機能し、開発者がlhsの評価結果からわかる場合は、評価されていないrhs式に依存できるように、評価は常に&&左から右に進むことが要求されます。

于 2012-05-03T13:48:51.310 に答える
1

Cでは、0以外はすべてtrueとして扱われ、||の評価 左から右に開始します。

したがって、コンパイラは最初の左側のオペランドをチェックし、それがtrueの場合、コンパイラは他のオペランドをチェックしません。元。A || B-この場合、Aがtrueの場合、コンパイラはtrueのみを返し、BがtrueかFalseかをチェックしません。ただし、Aがfalseの場合は、Bをチェックして戻ります。つまり、Bがtrueの場合はtrueを返し、Bがfalseの場合はfalseを返します。

プログラムでは、コンパイラは最初に++ x(ie 2)をチェックし、Cでは0以外は真です。したがって、他の式をチェック/インクリメントしません。

于 2014-09-11T13:49:41.163 に答える