[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