int i=2;
i = ++i + ++i + ++i;
どちらがより正しいですか? Java の結果は 12 または C = 13 です。または、正確さの問題ではない場合は、詳しく説明してください。
int i=2;
i = ++i + ++i + ++i;
どちらがより正しいですか? Java の結果は 12 または C = 13 です。または、正確さの問題ではない場合は、詳しく説明してください。
Javaは、左から右に評価され、12を与えることを保証します( §15.7.1++
)。具体的には、より高い優先順位があり+
ます。したがって、最初にそれらをバインドし、次に追加操作を左から右に関連付けます
i = (((++i) + (++i)) + (++i));
§15.7.1は左側のオペランドが最初に評価されることを示し、§15.7.2は両方のオペランドが操作の前に評価されることを示します。したがって、次のように評価されます。
i = (((++i) + (++i)) + (++i));
i = ((3 + (++i)) + (++i)); // i = 3;
i = ((3 + 4) + (++i)); // i = 4;
i = (7 + (++i)); // i = 4;
i = (7 + 5); // i = 5;
i = 12;
Cでは、間にシーケンスポイントがない状態で変数を2回変更することは未定義の動作です。
これほど正しいものはありません。これは実際には未定義であり、シーケンスポイントエラーと呼ばれます。 http://en.wikipedia.org/wiki/Sequence_point
Javaの結果は、演算子が期待どおりの結果をもたらすため、私には理にかなっていますが、深刻なプログラムにこのようなステートメントを含めることはできません。
編集:私はこの一文の回答が夕方の私の最高得点の回答であったことを面白がっています(私が投稿した他の12の回答と比較して、いくつかはコードサンプルのページがあります)。それが人生だ。
C では、これは未定義の動作です。正しい動作はありません。