为什么这个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 ...
答案 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 )