0

そうであれば、次のプログラムの出力はどうなりますか。

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

出力は gcc では ** -2 2 0 1 ** ですが、どうやって?

4

4 に答える 4

3

++i-2はゼロではないため、ブール値のコンテキストでは「真」であり、短絡条件はそこで停止し、元の値jk保持します。ブール値の "true" は、 value の整数に変換され、1に割り当てられmます。

于 2013-01-18T16:50:09.540 に答える
2

優先順位によって、オペランドと演算子のグループ化が決まります。評価の順序は決定しません。||and&&は左から右への評価を強制します。++i最初に評価されます。結果が 0 でない場合 (この場合など)、++j && ++kはまったく評価されません。

于 2013-01-18T17:03:57.220 に答える
1

これは、論理演算子が短絡評価を行うためです。

結果が判明するとすぐに、それ以上の評価は行われません。

あなたの場合、 as が++i評価されtrue、その後に or が続くと、それ以上のサブ式は評価されません。

「優先度」で何が起こるかは次のとおりです。||(最も低い「優先度」) の結果を計算するには、コンパイラは最初に左側の結果を計算する必要があります。あなたのケースでtrueは、式全体の結果がわかっているので、それ以上の計算は必要ありません。

右側を評価する必要がある場合、 は の++前に評価され||ます。

于 2013-01-18T16:51:35.280 に答える
0

「||」の後の部分については、他の人がすでに説明しています 評価されません。ただし、この動作につながる標準の非常に重要な部分を強調したいと思います。「||」論理演算子はシーケンス ポイントとして機能し、同じ式内の他の演算子に関係なく、左から右への評価順序が必要です。

標準ISO/IEC 9899からの引用(6.5.13/14、88 ページ)

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

つまり、"a + b * c" は "a || b && c" とは異なり、前者はシーケンス ポイントのない 1 つの式として扱われ、後者はシーケンス ポイントのある式として扱われます。名前が示すように、シーケンス ポイントは評価のシーケンスを強制します。完全な式の結果が評価されるとすぐに (たとえば、|| の LHS が '1' に評価される場合)、式のさらなる評価を停止できます。したがって、あなたが見る順序。

于 2014-11-26T04:43:35.163 に答える