2016-09-12 5 views
2

なぜこのcodeは "0"の代わりに "4"の値を与えますか?定義が異なる方法で処理されていますか?

#define PLUGIN_PPQ 96 
#define MIDIENGINE_SCORE_LENGTH PLUGIN_PPQ * 4 

int main() 
{ 
    int mCurrentPatternPulse = 97; 
    int patternBar = (int)floor(mCurrentPatternPulse/MIDIENGINE_SCORE_LENGTH); 
    cout << "value: " << patternBar << " (" << MIDIENGINE_SCORE_LENGTH << ")"; 
} 

384分の97(と/床なし)私には0

を与えるしかし、96の代わりに、384で除算思えるでしょうか?たとえ私が印刷したとしても、MIDIENGINE_SCORE_LENGTHは384です...

+2

Protip:

はいくつかのブラケットを追加する代わりに、 'constexpr'変数を使用してください。マクロのようにコンパイル時に処理されますが、変数であるため演算子の優先順位を尊重し、それらは言語に知られています。 –

+0

@LưuVĩnhPhúc:他の言語(C++ではなくC言語)。根本原因が共有されている、解決策はありません。 Cには 'constexpr'がありません。 – MSalters

+0

@MSalters私はあなたを取得しません。そのリンクはOPの問題を説明しています。多くのC++の質問が[この1つ](http://stackoverflow.com/q/35039313/995714)のような質問によって重複して報告されていることがわかります。 'constexpr'はこの質問に対する答えではなく、提案です。 –

答えて

5

「文字列置換」であり、数学演算ではないとします。

のでMIDIENGINE_SCORE_LENGTHので、あなたのコードは次のように見えますが、384 96 *4

ではありません。

floor(mCurrentPatternPulse/96 *4); 

mCurrentPatternPulse/96が最初に評価されます。

floor(mCurrentPatternPulse/(MIDIENGINE_SCORE_LENGTH)); 

編集:

それとも、より良い定義を直接に入れ:

#define MIDIENGINE_SCORE_LENGTH (PLUGIN_PPQ * 4) 
+3

もちろん、実際には、括弧はそれぞれの用途にではなく、' MIDIENGINE_SCORE_LENGTH'の*定義*に入るべきです。 – Angew

+0

@Angew ofcあなたはそこにいます。これを答えに加えました。 – Hayt

5

#defineは単なるテキストの置き換えです。演算子の優先順位を調べる必要があります。

6

マクロを選択解除した場合/*が同じ優先を持っているので、あなたが

floor(mCurrentPatternPulse/PLUGIN_PPQ * 4);

を取得し、その後、評価は左から右にあるので、式は

に相当しますfloor((mCurrentPatternPulse/PLUGIN_PPQ) * 4)

(mCurrentPatternPulse/PLUGIN_PPQ)は、整数算術であるため、剰余は乗算の前に破棄されます。

関連する問題