1

定数式を説明するとき、標準(まあ、ドラフトN1570)はこの「啓発的な」例を示します:

118)
したがって、次の初期化では、
static int i = 2 || 1 / 0;
式は、値が 1 の有効な整数定数式です。

この式はどのように評価されますか?

4

1 に答える 1

4

論理和は、||常に 0 または 1 を返します。最初にその左のオペランドが評価され、次に、左のオペランドの評価の結果が 0 の場合、右のオペランドが評価され、右のオペランドも評価される場合、式の値は 0 になります。それ以外の場合は 0、1。左のオペランドの評価がゼロ以外の値になった場合、右のオペランドを評価せずに式全体が 1 に評価されます。

除算演算子/の優先順位は、論理 or 式の優先順位よりも高くなります。

2 || 1 / 0

暗黙的に括弧で囲まれています

2 || (1 / 0)

式ツリーとして:

     (||)
    /    \
   2     (/)
        /   \
       1     0

優先順位はツリーの形状を決定しますが、評価の順序は優先順位とは無関係です (優先順位がデータ依存性を決定する場合を除く)。一部の演算子 ( ||&&?:,) では、オペランドの評価順序が指定されます [そして、左オペランドの評価後に結果がすでに決定されている場合、 and の右オペランド||&&まったく評価されません。2 番目と 3 番目のオペランドののオペランド?:、1 つだけが評価されます - どちらが最初のオペランドの評価によって決定されます]、一般に、演算子ノードの子の評価の順序は指定されていません。

||inの左オペランド

static int i = 2 || (1 / 0);

(定数式2) がゼロ以外の値に評価されると、式の評価はそこで停止し、

2 || 1 / 0

は 1 です。

の評価は||、セクション 6.5.14、パラグラフ 4 で指定されています。

|ビットごとの演算子とは異なり、||演算子は左から右への評価を保証します。2 番目のオペランドが評価される場合、1 番目と 2 番目のオペランドの評価の間にシーケンス ポイントがあります。最初のオペランドが 0 と等しくない場合、2 番目のオペランドは評価されません

およびその戻り値同上、段落 3:

オペランドの||いずれかが 0 と等しくない場合、演算子は 1 を返します。それ以外の場合は 0 になります。結果の型はintです。

于 2013-05-15T12:37:57.010 に答える