Странное C арифметическое поведение

У меня проблема с этим фрагментом кода C:

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

Он должен установить h на 640, но вместо этого он установлен на 0!

Вы можете увидеть это работает здесь: http://ideone.com/zBZSsr

Есть идеи об этом странном поведении? Я делаю что-то неправильно?

1

Решение

ваш код предварительно обрабатывается до

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

проблема в том, что + и — имеет приоритет над?: оператор.

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

add () вокруг определений, и ваши вычисления будут правильными.

3

Другие решения

Макрос 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))
10

По вопросам рекламы [email protected]