LINUX.ORG.RU

Запутался с define

 ,


0

1

Привет всем есть обычный дефайн

#define max(x,y) ((x)>(y) ? (x) : (y))
int x = y = 10;
Почему при max(++x, y++) инкремент x происходит 2 раза ?

★★★★

Последнее исправление: beastie (всего исправлений: 1)

Тело сишного макроса подставляется в исходный код. Таким образом, при вызове макроса

max_value = max(++x, y++);

после обработки препроцессором получим

max_value = ((++x)>(y++) ? (++x) : (y++));

и в зависимости от результата вычисления условного выражения тернарного оператора одна из переменных будет инкрементирована два раза.

Поведение, которое ты ожидаешь, достигается с помощью функций.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

И да, с сишными макросами в подобных выражениях есть вероятность наткнуться на нарушение точек следования (не в данном примере), так что надо быть осторожней с побочными эффектами ☺

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

мне просто было интересно чего оно так, угу я сделал что-то типа

template <class T>
inline const T& max(const T& a, const T& b) 
{
	return a > b ? a : b;
}
за дефайн вообще забыл как он работает(

Boy_from_Jungle ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.