1

重複の可能性:
誰でもこれらの未定義の動作 (i = i++ + ++i 、i = i++ など) を説明できますか
? 未定義の動作とシーケンス ポイント

i++ は次の行で値を 1 ずつ増やし、同じ行で ++i を増やします
(間違っている場合は訂正してください)
。したがって、c のサンプル ステートメントは次のようになります。

int a=0;  
printf("%d , %d",++a,a);  

予想される出力は次のようになるはずです1 , 1が、代わり に、値が既にインクリメントされている場合ではなく、印刷1 , 0 の2番目のリンクがなぜ行われるのかを推測するかもしれません 。i01

ポストインクリメントが同じ行で値をインクリメントしなかった場合、ポストインクリメントとプレインクリメントの違いは何ですか?
edit : 文法上の混乱を避けるために、変数の名前を i から a に変更しました。

4

5 に答える 5

4

インクリメント演算子の理解が非常に間違っています。 i++をインクリメントiし、古い値を返します。++iをインクリメントiし、新しい値を返します。実際のインクリメントが行われるタイミングは、前のシーケンス ポイントの後、次のシーケンス ポイントの前であることが保証されます。コードでは、これは への呼び出しの前を意味しますprintf

それを超えて (そして主にそれが原因で)、オブジェクトの値を変更すると、新しい値を決定する必要がある場合を除いて、介在するシーケンス ポイントがなければ、他の場所にアクセスすることはできません。このルールに違反しているため、コードの動作は未定義です。

于 2012-01-12T17:20:35.587 に答える
1
printf("%d , %d",++i,i);

未定義の動作です。

あなたはCシーケンスポイントルールに違反しています:

(C99, 6.5p2) 「オブジェクトは、前のシーケンス ポイントと次のシーケンス ポイントの間で、式の評価によって最大 1 回変更された保存された値を持つものとします。さらに、前の値は、保存される値を決定するためにのみ読み取られるものとします。」

于 2012-01-12T17:19:36.110 に答える
1

あなたの質問は、インクリメントがどのように機能するかについてではないと思います。あなたが観察した現象は、関数にパラメーターを渡す順序に関するものです。私が覚えている限り、これは C++ 標準では定義されていないため、未定義の動作です。つまり、コンパイラが異なれば、実装も異なる可能性があります。たとえば、あるコンパイラはパラメータを左から右に渡し、別のコンパイラはパラメータを右から左に渡すことができます。

ここでシーケンス ポイントをよりよく読むことができます: http://en.wikipedia.org/wiki/Sequence_point

于 2012-01-12T17:18:08.093 に答える
1

未定義の動作です。コンパイラは、任意の順序でパラメータを計算できます。コンパイラは右から左に計算するだけなので、一番右のパラメータは 0 で、2 番目のパラメータは 1 です。

編集:セスが言ったように、コンパイラは計算の順序を自由に変更することしかできず、必要なことを何もしないため、順序を気にしない場合は関数を自由に呼び出すことができますが、1 つのパラメーターが他の前に計算されています。

于 2012-01-12T17:16:19.873 に答える
1

ステートメントが次のような場合、ある本を読んだことがあります。

printf("%d , %d",++a,a);

実行は右から左に開始されますが、出力は左から右になります。したがって、out は 1 0 として表示されます - 「a」は最初に計算されます = 0、次に「++a」 = 1 ですが、1 0 として表示されます

これは奇妙ですが、そうです。

お役に立てれば。

于 2012-01-12T17:37:24.983 に答える