2016-11-16 10 views
-3

の次の行を解釈しないので、私は、この基本的な正方形の機能のための前処理マクロを使用しています:プリプロセッサ、どのようにコードC++

#define SQUARE(a) a*a 

これらを実行するには、これらの関数に渡され、それぞれのタスク:

:そのような機能を有する

double f(double x) { 
    return SQUARE(x); 
} 
double g(double x) { 
    return SQUARE(1-x); 
} 
double h(double x) { 
    return 1/SQUARE(x); 
} 

、G(x)とh(x)のiについては、次のような結果を得ています

g(2) = -3, h(2) = 1 
g(3) = -5, h(3) = 1 
g(4) = -7, h(4) = 1 
etc... 

私は予想される結果を得るために関数を変更しましたが、私はこのような奇妙な結果を与えるために上記の関数で何が起こっているのか不思議ですか?

+2

http://stackoverflow.com/questions/10820340/the-need-for-parentheses-in-macros-in-c – SingerOfTheFall

+0

あなたがreccomendだろうどのような書籍の基本的なC++最初 –

+0

についての本を読みますか? – NoName

答えて

1

SQUARE(1-x)は、1-x*1-xになりますが、これはまったく正しくありません。

マクロの代わりに関数を使用するほうがはるかに良いでしょう。関数はパラメータを1回評価します。

double square(double a) 
{ return a * a; } 
+0

私の質問のポイントはコード評価ではなく、私の結果をもたらすシーンの裏に何が起こっているのかを尋ねていました。私の最終的なプログラムで使用されていない、このコードは私が完全によく分かっていますが、なぜ間違っているのかを知りたいだけです。 – NoName

+3

@NoName文字通り、この答えの最初の文は何が起こっているのかを説明します。 –

+0

括弧についてのリンクをありがとうございますが、なぜこの投稿が投票に値するのかわかりません。私はこの公式を与えられて修正をお願いしましたが、私はこのマクロを#define [ ] #define g(x)f((1-x)) #define h(x)1 /(f(x)) ' 、元は括弧なしで与えられ、その問題の原因であったことを認識していません。 – NoName

関連する問題