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.