奇怪的C算术行为

Strange C arithmetical behavior

本文关键字:      更新时间:2023-10-16

我对这段C代码有一个问题:

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

它应该设置h为640,但它被设置为0!

你可以看到它在这里运行:http://ideone.com/zBZSsr

对这种奇怪的行为有什么想法吗?我做错了什么吗?

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

你有

:

#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))

你的代码被预处理为

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

问题是+和-比?:运算符优先。

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

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

相关文章:
  • 没有找到相关文章