定义处理是否有所不同

时间:2016-09-12 13:22:29

标签: c++

为什么这个code给我的值是“4”而不是“0”?

#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 << ")";
}

97/384(有/无楼层)应该给我0.

但它似乎除以96而不是384?即使我打印MIDIENGINE_SCORE_LENGTH是384 ...

3 个答案:

答案 0 :(得分:6)

如果你取消宏,那么你得到

floor(mCurrentPatternPulse / PLUGIN_PPQ * 4);

由于/*具有相同的优先级,因此评估是从左到右,因此表达式相当于

floor((mCurrentPatternPulse / PLUGIN_PPQ) * 4)

请注意,(mCurrentPatternPulse / PLUGIN_PPQ)是在整数算术中执行的,因此在乘法之前会丢弃任何余数。

答案 1 :(得分:5)

#defines只是文本替换。您需要查找运算符优先级。

答案 2 :(得分: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 )