1

我对这段 C 代码有疑问:

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

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

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

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

4

2 回答 2

10

您链接的示例中的 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))
于 2013-03-02T23:16:39.820 回答
3

您的代码被预处理为

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

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

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

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

于 2013-03-02T23:28:04.233 回答