2011-02-03 2 views
5

Один из моих друзей показал мне эту программу и спросил меня, почему i переменная получает увеличение в два раза.Почему переменная «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?

Спасибо.

+2

Также помните, что 'main' должен возвращать' int'! – peoro

+1

Несомненно, это должен быть дубликат какого-то более раннего вопроса? –

+0

@larsmans Это может быть, и я даже не знаю, что именно искать в этой проблеме. – Searock

ответ

5

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

8

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

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

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

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

Что делает

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

расширить до

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

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

2

Macro сделать простой замену текста, поэтому после макро расширения, k = MAX(i++, ++j); линия рассматривается компилятором как:

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

Your MAX макрос подставляет

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

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

4

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

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

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

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

1

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

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

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

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

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

2

Макрос будет расширен на что-то подобное в коде псевдо-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 
Смежные вопросы