Почему переменная "i" увеличивается в моей программе дважды? - PullRequest
6 голосов
/ 03 февраля 2011

Один из моих друзей показал мне эту программу и спросил, почему переменная i увеличивается в два раза.

В соответствии с моим пониманием MAX(i++, ++j); в этой строке i сначала отправляется в качестве параметра, а затем увеличивается, поэтому, если начальное значение i равно 10, то увеличенное значение должно быть 11, но показывает увеличенное значение i как 12.

Программа:

#include<stdio.h>

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

void main(void)
{
    int i = 10;
    int j = 5;
    int k = 0;

    k = MAX(i++, ++j);

    printf("%d %d %d",i,j,k);
}

Вывод:

12 6 11

Может кто-нибудь объяснить, как значение увеличивается до 12?

Спасибо.

Ответы [ 8 ]

8 голосов
/ 03 февраля 2011

MAX - это макрос, а не функция.В вашем случае он расширяется до:

k = (i++) > (++j) ? (i++) : (++j);
5 голосов
/ 03 февраля 2011

Ваше определение макроса содержит аргументы дважды

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

Что делает

 k = MAX(i++, ++j);

расширением до

k = (i++)>(++j)?(i++):(j++);

И, таким образом, увеличивается в два раза.

5 голосов
/ 03 февраля 2011

Ваша подстановка макроса означает, что вы пишете (i++)>(++j)?(i++):(++j).

4 голосов
/ 03 февраля 2011

MAX не является функцией.i не отправляется в качестве параметра.

MAX - это макрос.Текст заменяется там, где он используется:

k = (i++)>(j++)?(i++):(j++)

Теперь вы знаете, почему он увеличивается вдвое.

2 голосов
/ 03 февраля 2011

Макрос будет расширен до чего-то похожего на псевдо-C код:

if( i++ > j++)  // i is incremented the first time,  j is incremented once
   return i++;  // i is incremented the second time
else
   return j++;  // we never go there, so j is not incremented twice
2 голосов
/ 03 февраля 2011

Ваш макрос MAX расширяется до

(i++)>(++j)?(i++):(++j)

показывает, почему вы получаете двойной прирост.

2 голосов
/ 03 февраля 2011

Макрос выполняет простую подстановку текста, поэтому после раскрытия макроса компилятор видит строку k = MAX(i++, ++j); как:

k = (i++)>(++j)?(i++):(++j);
1 голос
/ 03 февраля 2011

При использовании MAX(i++, ++j) сгенерированный код будет:

(i++) > (++j) ? (i++) : (++j)

Используя макрос препроцессора, просто разверните код и скопируйте / вставьте аргументы на месте. Возможно, вы захотите использовать функцию для этого случая.

int max(int x, int y)
{
  return (x > y ? x : y);
}

Современный компилятор встроит его, соблюдая оригинальное поведение вызова функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...