2012-07-16 24 views
6

Por favor, explícame por qué se comporta de manera diferente.¿Por qué la salida es diferente?

int main() { 
    int p; 
    p = (printf("stack"),printf("overflow")); 
    printf("%d",p); 
    return 0; 
    } 

Esto da la salida como stackoverflow8. Sin embargo, si quito el un paréntesis, entonces:

p = printf("stack"),printf("overflow"); da la salida como stackoverflow5

Respuesta

13

The Comma Operator

El operador coma tiene prioridad más baja que la asignación (tiene una prioridad más baja que cualquier operador para que asunto), por lo que si quita los paréntesis, la asignación tiene lugar primero y el resultado de la segunda expresión se descarta. Así que ...

int a = 10, b = 20; 
int x = (a,b); // x == 20 
int y = a,b; // y == 10 
// equivalent (in terms of assignment) to 
//int y = a; 

Tenga en cuenta que la tercera línea se producirá un error, ya que se interpreta como una nueva declaración de b, es decir:

int y = a; 
int b; 

me perdí esto al principio, pero hace sentido. No es diferente de la declaración inicial de a y b, y en este caso la coma no es un operador, es un separador.

+2

int y = a, b; es equivalente a int y = a; y int b; – h4ck3d

+0

Lo tengo. Gracias. – h4ck3d

+0

@EdS. Probé tu código con gcc, y la tercera afirmación da una "redeclaración de 'b'" y una "definición previa de error 'b'". – abelenky

Cuestiones relacionadas