- ベストアンサー
演算子(+=)について
演算子(+=)について C言語のプログラム中に(1)の文が存在するのですが、(2)の文と同じ意味でよろしいでしょうか? a+=8; ・・・(1) a=a+8; ・・・(2) 教授下さい。 よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず、初心者のうちは、 (1)と(2)は同じで、 「変なマクロは定義しない」 ← ここ重要。 と覚えましょう。 #define a (*(++p)) ← 非常に悪い、プログラミングの例です。 (何が悪いか?、それは変な副作用を生むからです。) 以上。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
(1) は a を 1回, (2) は a を 2回評価します. なので, a の部分に副作用のあるもの (インクリメント, デクリメント, 代入など) を書いてしまうとアウトです. たとえば #1 のように #define a (*(++p)) とあったりすると (2) は不正なプログラムとなります.
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
結果は同じですが、意味、動作は異なります。場合によっては結果も異なります。 1)の場合、通常は「aに8を足す、最適コード」が生成されます。 2)の場合、通常は「aを評価し、評価値に8を足し、aに代入するコード」が生成されます。 コード最適化オプションをオンにしてコンパイルすれば、たいていは「1)と2)で同じコードが生成」されます。 しかし、最適化が行われない場合、1)と2)は異なるコードが生成される場合があります。 従って「aが副作用を含むオブジェクト(評価すると副作用が起きるオブジェクト)」の場合、異なるコードが生成された事が原因で、異なる副作用を引き起こす可能性があります。 例えば、 #define a (*(++p)) などと書かれていた場合、1)と2)では副作用の結果が異なります。
補足
ご回答ありがとうございます。 >例えば、 >#define a (*(++p)) >などと書かれていた場合、1)と2)では副作用の結果が異なります。 最近プログラミングを始めたもので・・・ お手数ですが、この部分をもう少し具体的に説明して頂いてもよろしいでしょうか? よろしくお願い致します。