奇怪的算术行为

时间:2013-03-02 23:11:52

标签: c++ c math integer-arithmetic

我对这段C代码有疑问:

int y = 0, h = 640, ih = 640;
h = y + h - max(0, (y + h) - ih);

它应该将h设置为640,而是设置为0!

您可以在此处看到它:http://ideone.com/zBZSsr

有关这种奇怪行为的任何想法吗?我做错了吗?

2 个答案:

答案 0 :(得分:10)

您链接的示例中的最大宏需要一对额外的括号。

你有:

#define max(x, y) ((x) > (y)) ? (x) : (y)

在您的示例中,这将扩展为:

h = y + h - ((0) > ((y+h)-ih)) ? (0) : ((y+h)-ih);

我认为运算符优先级意味着左边的所有内容都包含在三元运算符的条件表达式中。有一些隐式转换从bool到int再返回,导致一个始终为真的条件,所以你得到真正的分支,它只是0。

你的宏应该是:

#define max(x, y) (((x) > (y)) ? (x) : (y))

答案 1 :(得分:3)

您的代码被预处理到

h = y + h - ((0) > ((y + h) - ih)) ? (0) : ((y + h) - ih);

问题是+和 - 优先于?:operator。

#define max(x, y) ((x) > ((y)) ? (x) : (y))

在定义周围添加(),您的计算将是正确的。