2011-02-03 11 views
5

Uno de mis amigos me mostró este programa y me preguntó por qué la variable i se incrementaba dos veces.¿Por qué la variable "i" se incrementa dos veces en mi programa?

Según mi entendimiento MAX(i++, ++j); en esta línea i se enviará primero como un parámetro y luego incrementado, por lo que si el valor inicial de i es 10 entonces el valor incrementado debería haber 11, pero muestra el valor incrementado de i como 12 .

Programa:

#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); 
} 

Salida:

por favor alguien puede explicar cómo se incrementa el valor a 12?

Gracias.

+2

Asimismo, recuerda que 'main' debe devolver un' int'! – peoro

+1

Sin duda, esto debe ser un duplicado de alguna pregunta anterior? –

+0

@larsmans Podría ser que ni siquiera yo sepa exactamente qué buscar este tipo de problema. – Searock

Respuesta

5

Su sustitución de macro significa que usted escribe (i++)>(++j)?(i++):(++j).

8

MAX es una macro, no una función. En el caso de uso, se expande a:

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

Su definición de macro contiene los argumentos doble

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

Lo que hace

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

expanda a

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

Y así , se incrementa dos veces

2

Macro hacer la sustitución de texto simple, así que después de la expansión de macros, la línea k = MAX(i++, ++j); es visto por el compilador como:

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

Sus MAX expande macro a

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

mostrando por qué usted consigue un doble incremento.

4

MAX no es una función. i no se envía como parámetro.

MAX es una macro. Se reemplaza por texto donde se usa:

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

Ahora sabe por qué se incrementa dos veces.

1

Al utilizar MAX(i++, ++j), el código generado será:

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

Usando macro preprocesador simplemente ampliar el código y copiar/pegar los argumentos en su lugar. Es posible que desee utilizar una función para este caso.

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

El compilador moderno lo alineará respetando el comportamiento original de la llamada a la función.

2

La macro se expandirá a algo así como en el código de pseudo-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 
Cuestiones relacionadas