operator c c-preprocessor operator-precedence

operator - C#define macros



operator precedence java (7)

Esto es lo que tengo y me pregunto cómo funciona esto y lo que realmente hace.

#define NUM 5 #define FTIMES(x)(x*5) int main(void) { int j = 1; printf("%d %d/n", FTIMES(j+5), FTIMES((j+5))); }

Produce dos enteros: 26 y 30.

¿Como hace eso?


define es solo una cadena de sustitución.

La respuesta a su pregunta después de eso es el orden de las operaciones:

FTIMES (j + 5) = 1 + 5 * 5 = 26

FTIMES ((j + 5)) = (1 + 5) * 5 = 30


Como todavía no se ha mencionado, la forma de solucionar este problema es hacer lo siguiente:

#define FTIMES(x) ((x)*5)

Los paréntesis alrededor de x en la expansión de la macro evitan el problema de asociatividad del operador.


El preproceso del compilador simplemente hace una sustitución de FTIMES donde quiera que lo vea, y luego compila el código. Entonces, en realidad, el código que ve el compilador es este:

#define NUM 5 #define FTIMES(x)(x*5) int main(void) { int j = 1; printf("%d %d/n", j+5*5,(j+5)*5); }

Luego, tomando en cuenta la preferencia del operador, puede ver por qué obtiene 26 y 30.


La razón por la que esto ocurre es porque su macro expande la impresión a:

printf("%d %d/n", j+5*5, (j+5)*5);

Sentido:

1+5*5 and (1+5)*5


Orden de operaciones.

FTIMES (j + 5) donde j = 1 se evalúa como:

1 + 5 * 5

Cual es:

25 + 1

= 26

Al hacer FTIMES ((j + 5)) lo ha cambiado a:

(1 + 5) * 5

6 * 5

30


Y si quieres arreglarlo:

#define FTIMES(x) ((x) * 5)


el preprocesador sustituye todas las ocurrencias NUM en el código con 5 y todos los FTIMES (x) con x * 5. El compilador luego compila el código.

Es solo una sustitución de texto.