У меня проблема с этим фрагментом кода 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 () вокруг определений, и ваши вычисления будут правильными.
Макрос 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))