Невозможно понять вывод программы на C - PullRequest
0 голосов
/ 13 октября 2018

РЕДАКТИРОВАТЬ: Этот вопрос не является дубликатом, поскольку в этом случае поведение не является неопределенным.

Почему приведенная ниже программа печатает вывод в виде 231 в первой строке?

У меня есть два сомнения по этому поводу:

  1. Поскольку я делаю постфиксное увеличение, значение x не должно было быть увеличено до того, как я вызову функцию max.Таким образом, результат должен был быть 1 во-первых вместо 2 по моему мнению.Чего мне не хватает?

    #define prn(a) printf("%d",a)
    #define print(a,b,c) prn(a), prn(b), prn(c)
    #define max(a,b)  (a<b)? b:a
    
    main()
    {
        int x=1, y=1;
        print(max(x++,y),x,y);
        printf("\n");
        print(max(x++,y),x,y);
    }
    

    Вывод:

    231
    451
    
  2. Операция postfix происходит после выполнения оператора?Рассмотрим пример ниже.

    int main()
    {
        int x = 0, y = 1;
        int a = x++ /*x is incremented hereafter?*/+ y;             // line 1
        /* Or x is incremented now after execution of above line?*/ // line 2
        int b = 0;
    }
    

1 Ответ

0 голосов
/ 13 октября 2018

позвольте мне взять эту строку

               print(max(x++,y),x,y);

Важно отметить, что препроцессор C - это препроцессор макросов (позволяет определять макросы), который преобразует вашу программу перед ее компиляцией.Этими преобразованиями могут быть включение файла заголовка, расширение макроса и т. Д.

Все директивы предварительной обработки начинаются с символа #.Например,

                #define PI 3.14

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

           c source code->preprocessor->compiler

, поэтому print (max (x ++, y), x, y)в макросе расширена до

           1.      prn((x++<y) ? y:x++), prn(x), prn(y) 

        2. printf("%d",(x++<y)? y:x++), printf("%d",x), printf("%d",y);.

здесь это обрабатывается, вы можете тщательно проверить две вещи здесь

, проверяя

               x++<y ,the x++ value is 1

, после чего значение x становится равным 2

, поэтому печатается 2

, а затем при печати мы также написали x ++, что означает здесь x ++ VALUE IS 2, но

после этого значение x равно 3

так что 3 печатается и следует y как 1

, вот как это работает

2. Чтобы дать вам отличную интуицию по преинкременту и постинкременту

позвольте мне взятьпример

               int x=2;//value of x is 2

               x++;//here x++ value is 2

после выполнения этой строки значение x изменилось на 3

               ++x//here x++ value is 4 and also x value is 4.
...