2010-12-04 10 views

Respuesta

9

Un operador de coma es un punto de secuencia: cada expresión separada por comas se evalúa de izquierda a derecha. El resultado tiene el tipo y el valor del operando correcto. Funcionalmente, el ejemplo es equivalente a (que es más legible?):

else 
{ 
    *pbuf++ = '%'; 
    *pbuf++ = to_hex(*pstr >> 4); 
    *pbuf++ = to_hex(*pstr & 15); 
} 

Aquí es otro ejemplo de que la norma prevé el operador coma (6.5.17):

En la llamada de función

f(a, (t=3, t+2), c) 

la función tiene tres argumentos, el segundo de los cuales tiene el valor 5.

8

De Wikipedia:

En los lenguajes de programación C y C++, el operador coma (representado por el símbolo,) es un operador binario que evalúa su primer operando y descarta el resultado, y luego evalúa el segundo operando y vuelve este valor (y tipo). El operador de coma tiene la precedencia más baja de cualquier operador C y actúa como un punto de secuencia.

El uso del token de coma como operador es distinto de su uso en llamadas a funciones y definiciones, declaraciones de variables, declaraciones enum y construcciones similares, donde actúa como un separador.

En este ejemplo, el comportamiento diferente entre la segunda y la tercera línea se debe a que el operador de coma tiene una prioridad menor que la asignación.

int a=1, b=2, c=3, i; // comma acts as separator in this line, not as an operator 
i = (a, b);    // stores b into i        ... a=1, b=2, c=3, i=2 
i = a, b;    // stores a into i. Equivalent to (i = a), b;  ... a=1, b=2, c=3, i=1 
i = (a += 2, a + b); // increases a by 2, then stores a+b = 3+2 into i ... a=3, b=2, c=3, i=5 
i = a += 2, a + b;  // increases a by 2, then stores a = 5 into i  ... a=5, b=2, c=3, i=5 
i = a, b, c;   // stores a into i        ... a=5, b=2, c=3, i=5 
i = (a, b, c);   // stores c into i        ... a=5, b=2, c=3, i=3 

Enlace: http://en.wikipedia.org/wiki/Comma_operator

+0

En 'i = a, b;', ¿qué está pasando con 'b'? ¿Por qué uno escribiría 'b' en este caso? – MichaelChirico

0

¿Por qué no debería trabajar? Establece %, to_hex(*pstr >> 4), to_hex(*pstr & 15) en el bloque de memoria secuencial direccionado por pbuf. El código equivalente puede ser el siguiente:

else { 
    *pbuf = '%'; 
    *(pbuf + 1) = to_hex(*pstr >> 4); 
    *(pbuf + 2) = to_hex(*pstr & 15); 
    pbuf += 3; 
} 
Cuestiones relacionadas