为何C++中#define定义的常量无法正确执行除法运算?
问题原因与解决方法
这是C++宏定义的文本替换特性导致的运算符优先级问题。
宏在预处理阶段是直接做文本替换,不会像函数那样先计算出结果再代入。你定义的LEN展开后是(2 * BLUR + 1) * (2 * BLUR + 1),当写50 / LEN时,预处理后的代码会变成:
50 / (2 * 2 + 1) * (2 * 2 + 1)
因为乘法和除法的优先级相同,运算顺序是从左到右:先算50 / 5得到10,再算10 * 5得到50,这就是错误结果的来源。
加法、减法时没出问题,只是刚好这些运算的优先级组合没触发顺序矛盾,但本质上原宏的写法存在通用隐患。
修正方法很简单,给LEN的整个表达式加一层括号,确保替换后它作为一个整体参与运算:
#define LEN ((2 * BLUR + 1) * (2 * BLUR + 1))
这样50 / LEN展开后就是50 / ((2*2+1)*(2*2+1)),先计算括号内的25,再算50/25得到预期的2。
内容的提问来源于stack exchange,提问作者reza sohrabi
相关产品推荐
相关产品推荐

