1

重複の可能性:
誰でもこれらの未定義の動作を説明できますか (i = i++ + ++i 、 i = i++ など…)

&& ++ と *****のオペレーター設定でこの混乱が生じています

int i=-1,k=-1,y,n;
y=++i*++i;
n=++k&&++k;
printf("%d %d %d %d",i,y,k,n);

出力 gcc : 1 1 0 0

ここで、y の場合、最初に i が 1 回インクリメントされます。つまり、i=0 になり、再び i がインクリメントされます。つまり、i=1 になりました。つまり 、++ は * よりも優先順位が高いため、 25 になります。

2番目のケースでは、 ++ が && よりも優先度が高いにもかかわらず、 k が 1 に増加しません。この現象を説明できる人はいますか??

4

7 に答える 7

7

y = ++i * ++i;同様の句は、2 つのシーケンス ポイント間で変数を複数回変更しているため、未定義の動作を引き起こします。文字通り、何でも起こると期待できます。

n = ++k && ++k;&&演算子は論理 AND 演算子であり、短絡を使用して評価されるため、実際には UB ではありません。つまり、その式にシーケンス ポイントがありますが、もう一方はまだ間違っています。

于 2012-11-15T06:54:12.313 に答える
4

彼らはここで違います。

まず、++i*++i未定義の動作です。2 つの副作用があり、それらを分割するためのシーケンス ポイントがありません。

第二に、++k&&++k短絡です。は 0 であるため++k、式は 0 である必要があります。2 番目の を評価する必要はありません++k&&がシーケンス ポイントであることが重要です。

于 2012-11-15T06:54:43.583 に答える
3

演算子の優先順位は、それらの演算子が評価される順序を決定するものではありません。評価の順序は指定されていません。

優先順位規則は、 がおよびとしてy=++i*++i;解釈されることを示しているだけですが、それ以外の場合、コンパイラは実際にそれらを任意の順序で実行できます。y=(++i)*(++i);n=++k&&++k;n=(++k)&&(++k);

この規則にはいくつかの例外があります。たとえば、標準では、論理 and 演算子 ( &&) が短絡することが義務付けられています。したがって、そのような式の左辺は右辺の前に評価する必要があります。

たとえば、式を考えてみましょうa = b+++c。優先順位規則により、この式は次のように解釈されることが義務付けられていa = (b++) + cます。ただし、コンパイラは、次の順序でこれを自由に実行できます。

  • b に 1 を加算して古い値をテンポラリに格納し、次に c とテンポラリを加算して、結果を a に格納します。
  • b と c の値を加算し、結果を a に格納し、b をインクリメントします。
  • b と c の値を足し合わせてテンポラリに格納し、次に b の値をインクリメントしてから、テンポラリを a に割り当てます。
于 2012-11-15T06:55:04.307 に答える
2

これはundefined behaviour、2 つのシーケンス ポイント間で変数の値を 2 回変更することです。

y=++i*++i; ここでは、2 つのシーケンス ポイント間で i を 2 回変更しています。

シーケンスポイントについては、このリンクを読んでください

n=++k&&++k;しかし、これは&&シーケンス ポイントであるため、明確に定義された動作です。ここではn == 0、論理の短絡のために取得しています&&

于 2012-11-15T06:54:23.743 に答える
2

ここでは優先順位は関係ありません。

最初のケース:では、シーケンス ポイントを介在させずに 2 回++i * ++i変更しているため、未定義の動作になります。i

2 番目のケースで&&は、シーケンス ポイントを定義する があるため、動作が定義されています。特に では&&、左のオペランドが評価され、それがゼロ以外の値を生成する場合にのみ、右のオペランドが評価されます。結果は、2 つの結果の論理andです。あなたの場合、kは として開始される-1ため++k、左側の が評価されると、結果は 0 になります。0 であるため、右側のオペランドはまったく評価されません。

于 2012-11-15T06:55:20.377 に答える
0

何が起こるかについての私の理解から、これは次のとおりです。

(++k)    && (++k)    -->  ans1 && ans2
-1 -> 0      0 -> 1        0   &&  1   = 0
                              ^ The rest will not be calculated. 

したがって、++k が最初に評価されますが、最初の ++k に対する別の回答が得られます (同じ演算子では左から右の順序であるため)。

したがって、答えは 0 になります。

于 2012-11-15T06:55:05.080 に答える
0
y=++i*++i;

これは未定義の動作です (言語標準では、変数の出力が毎回同じになることは保証されていません)。

n=++k&&++k;

&&は短絡演算子であるため、結果が第 1 オペランド自体で決定できる場合、第 2 オペランドは動作しません。第 1 オペランドが結果になる0ため、結果は false です。0

于 2012-11-15T06:55:37.870 に答える