- ベストアンサー
条件演算子でのインクリメントの使用
マクロとして以下のような定義をします。 #define max(x,y) ((x)>(y)?(x):(y)) この時ある本に以下のような記述がありました。 「マクロでは、max(x++,y)が、((x++)>(y)?(x++):(y))に展開されてインクリメントが2回行われるという副作用が発生します。ここに示す実現は、int型しか扱えないことが欠点とです」 とありましたが、以下のプログラム #include<stdio.h> #include"max.h"←maxマクロの定義 int main(void) { double x=1.1,y=2.0,max; max(x++,y): max=max(x,y); printf("x=%f y=%f\n",x,y); printf("max=%f\n",max); return 0; } をコンパイルすると x=2.100000 y=2.000000 max=2.100000 の結果がでます。これは 1.条件演算子ではインクリメントは1回しかおこなわれない。 2.条件演算子はdouble型でも実現できる ことになります。 この事は「インクリメントが2回行われるという副作用が発生します。ここに示す実現は、int型しか扱えないことが欠点です」という事に反する結果だとおもいますが、どこか間違いがあるのでしょうか。宜しくお願いします。環境としてはRed Hat でviを使っています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
x++;はxを評価した後にxをインクリメントする事は知っていますね? x=1.1; y=2; の時、x++ > y は偽です。 max(x++,y); が呼び出された時点で、xは1.1、yは2なので、 maxマクロは ((x)>(y)?(x):(y)) ↓ (1.1++>2?(x++):(y)) となり、条件式が偽なので、yが返され、x++は1度しか呼ばれません。 結果、インクリメントは1回しか行われないのです。 x=2.1;y=2;として実行してみて下さい。インクリメントは2回行われるはずです。 >2.条件演算子はdouble型でも実現できる これについてはわかりません。 すみません。
その他の回答 (2)
- aris-wiz
- ベストアンサー率38% (96/252)
>>インクリメント演算子が double 型に対して X3010を調べてみました。 X3010 - 6.5.2.4 後置換増分演算子または、 後置換減分演算子のオぺランドは、 実数型またはポインタ方の修飾版、 または、非修飾版を持ち変更可能な 左辺値でなければならない。 とあるので、規格上では、 整数型でも実浮動小数点型でも使用可能のようです。 #ただ、現存しているコンパイラで規格に則ったコンパイラは #かなり稀な為、この限りではないのも現状だとも思います。
- koko_u_
- ベストアンサー率18% (459/2509)
インクリメント演算子が double 型に対して「正常に」動作するかはよくわかりません。規約にあたって下さい。 インクリメントの回数の問題は、この場合、(x++) > (y) が false になり、後の x++ が評価されていないだけだと思います。