me di cuenta en una rutina¿Qué es un conjunto de asignaciones separadas por comas?
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
¿Por qué funciona?
¿Qué hace?
me di cuenta en una rutina¿Qué es un conjunto de asignaciones separadas por comas?
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
¿Por qué funciona?
¿Qué hace?
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.
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
¿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;
}
En 'i = a, b;', ¿qué está pasando con 'b'? ¿Por qué uno escribiría 'b' en este caso? – MichaelChirico