[C con Clase] La prioridad del operador ?:
Steven Davidson
srd4121 en njit.edu
Vie Mayo 28 20:21:48 CEST 2010
Hola Giancarlo,
Giancarlo wrote:
> El pasado 2010-05-28 17:05:34, Steven Davidson escribió:
>
> Gracias Steven. Ahora sí lo he entendido y veo que Jose tenía razón.
>
> Sin embargo, no entiendo porque el operador = se mete en el segundo
> miembro del ?:. Tal como salen los resultados es que tampoco se está
> efectuando la asignación antes que el ?: . Han quedado los operadores
> como entremezclados.
>
No hay entremezcla. En tu ejemplo, la asignación no es una operación
suelta; "pertenece" a la 3ª expresión (de falsedad) del operador ?:.
Como dije antes, cada sentencia tiene UNA sola expresión de un solo
operador: ?:. No se trata de dos expresiones: ?: y =. Éste fue el caso
de tu otro ejemplo en el que usabas paréntesis para separar los operadores.
Dentro de ?: hay tres expresiones:
1. a<b
2. b
3. a = 3 (y en el otro: a = 5)
Si quieres te pongo algo de la gramática acerca de la sintaxis de este
operador:
expresión-OR-lógica ? expresión : expresión-asignación
<expresión-OR-lógica> se refiere a cualquier expresión que contenga el
operador OR: || y todos los operadores de mayor precedencia: &&, |, ^,
&, ==, !=, etc..
<expresión> es cualquier expresión con cualquier operador: secuencia
(,), =, +=, -=, ..., ?:, ||, &&, |, ^, &, ==, etc.
<expresión-asignación> indica cualquier expresión que involucre un
operador de asignación: =, +=, -=, etc. al igual que otros operadores de
mayor precedencia: ?:, ||, &&, etc..
Como puedes ver, la primera expresión no puede contener asignaciones ni
secuencias ni tampoco el operador condicional, ?:. Si existiesen estos
expresiones, entonces se considerarían exclusivas a esta regla y
operación. Por ejemplo,
a = b>0 ? -b : 0;
Esto es equivalente a:
a = (b>0 ? -b : 0);
Es decir, la primera expresión del operador ?: es (b>0) y no: (a = b>0).
Para la segunda expresión de ?:, puede ser de cualquier "tipo". Por ejemplo,
a = b>0 ? c = -b, g = t() : 0;
Esto es equivalente a:
a = (b>0 ? (c = -b, g = t()) : 0);
Para la tercera expresión de ?:, sólo podemos usar operaciones que no
involucren el operador de secuencia (,). Prácticamente, puede haber
cualquier expresión que normalmente usamos:
a = b>0 ? c = -b, g = t() : d = 0, ++r;
que es equivalente a:
(a = (b>0 ? (c = -b, g = t()) : d = 0)), ++r;
Espero que esto aclare más el tema.
Steven
Más información sobre la lista de distribución Cconclase