IF文内の計算式

[戻る]
しまお 2005/02/22(火) 10:10:19
初歩的な質問で恐縮です。

if((buff++) > 10){
    buff = 1;
}

なんて構文を使ってみた場合、buffがインクリメント
されるタイミングがif評価をした後の様な動きをしてしまっています。
if内に計算式を入れているのも問題だと思っていますが、
動作としてどうなんでしょうか?
ちなみにVC++(Ver6.0)を使っています

2005/02/22(火) 10:25:33
if((buff++) > 10){
    buff = 1;
}
これは、buffがインクリメントされるのは if比較の後

if((++buff) > 10){
    buff = 1;
}
これは、buffがインクリメントされるのは if比較の前

確か、こんな感じだったと思います。

PATIO 2005/02/22(火) 11:31:57
説明内容に関しては、んさんが書かれている通りです。
ただ、この部分がわからないということは入門書等を読まれていないのではないかと
いう気がします。前置インクリメント演算子と後置インクリメント演算子の説明は
C++言語の入門書には必ずあると思います。
もし、本を持っていないようでしたら購入して読まれる事をお勧めします。

しまお 2005/02/22(火) 14:40:14
たしかに入門書はしっかりと読んでませんでした。
持ってもいないので、購入します。(高いのが痛いですが)
お勧めがあれば教えてください。

それと、
前置インクリメント演算子と後置インクリメント演算子については
判っているつもりでしたが、
if(buff++ > 10)
だと、んさんが書かれているとおりだと思っていましたが、
if((buff++) > 10)
の場合、後置インクリメントがあっても()が
あるので、if比較の前にインクリメントさせるのかな?と思っていたんですが

PATIO 2005/02/22(火) 15:20:41
前置とか後置の効力が現れるか否か境目は一つの解釈単位が基本だったと思います。
括弧は演算の順番を確定させるための物であり、解釈単位を変更する物ではないと
記憶しています。
ですから、if文の解釈単位は、ifに続くひとまとまりだと考えていいと思います。
セミコロンがある場合はもっとはっきりしていて「;」が解釈単位の終了を示すはずなので
これが前置と後置の効果が現れる境になると言う話だったと思います。

しまお 2005/02/22(火) 15:30:38
[[解決]]
んさん、PATIOさん
ありがとうございます。
スッキリしました。
実は人の作ったソースで、自分では
if((buff++) > 10){
の様な書き方はしないもので悩んでました。
これからもよろしくお願いします。

dairygoods 2005/02/22(火) 15:31:46
いつインクリメントされるかというのは
式の評価にはあまり関係ないです。

  buff++ の計算結果は「buffに1足す前の値」
  ++buff の計算結果は「buffに1足した後の値」
というだけです。

++演算子だと混乱するかもしれませんが、
  2*buff の計算結果は「buffの2倍の値」
というのと同じ事です。

で、 
  ○○ > 10
は、○○の計算結果が 10より大きいかを比較しています。
この比較をするときに、計算の元になった変数に
今どんな数字が入っているかという情報は影響しません。

PATIO 2005/02/22(火) 15:58:08
確かにそうですね。
比較演算子に引き渡されるのはあくまでもインクリメント演算子の計算結果であって
インクリメントされている変数の値ではありませんからね。
そういう意味では今回の話とは直接関係なかったかな。

古いスレッドには追加発言できません。