定数式を説明するとき、標準(まあ、ドラフトN1570)はこの「啓発的な」例を示します:
118)
したがって、次の初期化では、
static int i = 2 || 1 / 0;
式は、値が 1 の有効な整数定数式です。
この式はどのように評価されますか?
定数式を説明するとき、標準(まあ、ドラフトN1570)はこの「啓発的な」例を示します:
118)
したがって、次の初期化では、
static int i = 2 || 1 / 0;
式は、値が 1 の有効な整数定数式です。
この式はどのように評価されますか?
論理和は、||
常に 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
です。