2013-03-02 94 views
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

约定具有宏名称大写可用,并在这种情况下将有所帮助。 – Slava 2013-03-02 23:23:54

回答

3

您代码被预处理为

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

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

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

add()围绕定义和您的计算将是正确的。

10

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

您有:

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

在你的榜样,这将扩展为:

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

我相信运算符优先级是指左边一切都归入条件表达式为三元运算符。有来自布尔一些隐式转换成int,然后再返回,导致总是真实情况,这样,那么你获得真正的分支,这简直是0

您的宏应该是:

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

另一个“使用[内联]功能,而不是宏”。 – 2013-03-02 23:20:46

+2

@MatsPetersson我只会包含''并使用'std :: max'。 – cnicutar 2013-03-02 23:24:58

+0

这是一个内联(模板)功能...所以这是正确的。 – 2013-03-02 23:28:27