我有这一块的C代码的问题:奇怪ç算术行为
int y = 0, h = 640, ih = 640;
h = y + h - max(0, (y + h) - ih);
应该设定为H 640,而是被设置好的比0!
你可以看到它运行在这里:http://ideone.com/zBZSsr
任何想法,关于这种奇怪的行为?难道我做错了什么?
我有这一块的C代码的问题:奇怪ç算术行为
int y = 0, h = 640, ih = 640;
h = y + h - max(0, (y + h) - ih);
应该设定为H 640,而是被设置好的比0!
你可以看到它运行在这里:http://ideone.com/zBZSsr
任何想法,关于这种奇怪的行为?难道我做错了什么?
您代码被预处理为
h = y + h - ((0) > ((y + h) - ih)) ? (0) : ((y + h) - ih);
问题是+和 - 优先于?:运算符。
#define max(x, y) ((x) > ((y)) ? (x) : (y))
add()围绕定义和您的计算将是正确的。
您链接的示例中的最大宏需要一对额外的括号。
您有:
#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))
另一个“使用[内联]功能,而不是宏”。 – 2013-03-02 23:20:46
@MatsPetersson我只会包含'
这是一个内联(模板)功能...所以这是正确的。 – 2013-03-02 23:28:27
约定具有宏名称大写可用,并在这种情况下将有所帮助。 – Slava 2013-03-02 23:23:54