2013-12-12 7 views
1

Я имею в виду this questionПонимание побочных эффектов в использовании #define

#define max(a,b) ((a<b)?b:a)

это будет иметь какой-то побочный эффект, как указано в ответе;

Побочные эффекты возникают, если вы используете макс (A ++, б ++), например (а или б будет увеличиваться в два раза)

Я не могу понять этот побочный эффект; почему a или b будут увеличиваться дважды, когда мы используем max (a ++, b ++)?

+0

Помните, что макросы - это фактически замена текста. Разверните макрос, и вы должны увидеть проблему. –

+0

@FredLarson ваше предложение действительно помогло мне. спасибо – user25108

+0

Также прочитайте [Точка последовательности] (http://en.wikipedia.org/wiki/Sequence_point) –

ответ

7

Если вы используете max(a++,b++) в вашем коде, как это,

x = max(a++,b++); 

текст замена происходит в

x = ((a++<b++)? b++ : a++); 
    ^^ ^---------Increment if condition is true 
     |---|---------Increment 

Так вы будете приращением либо a или b дважды ...

+1

В скобках нет букв 'a ++' и 'b ++'. – timrau

+0

Замена текста на самом деле будет 'x = ((a ++

+0

@timrau Ya пыталась отредактировать текст, но браузер застрял. Извините за ошибку ... –

1

max(a++, b++) будет расширен как ((a++ < b++) ? b++ : a++). При оценке слева выражение (a++ < b++) имеет приоритет и будет увеличивать как a, так и b. Это первый приращение. Затем в зависимости от вывода оператора < либо a, либо b снова будет увеличиваться (это второй приращение).

Смежные вопросы