relacionales prioridad precedencia operadores operador lenguaje jerarquia condicional aritmeticos c++ c conditional-operator

prioridad - Diferencias de operador condicional entre C y C++



precedencia de operadores en c (2)

Leí en alguna parte que el operador ?: En C es ligeramente diferente en C ++, que hay algún código fuente que funciona de manera diferente en ambos idiomas. Lamentablemente, no puedo encontrar el texto en ninguna parte. ¿Alguien sabe cuál es esta diferencia?


El operador condicional en C ++ puede devolver un lvalue, mientras que C no permite una funcionalidad similar. Por lo tanto, lo siguiente es legal en C ++:

(true ? a : b) = 1;

Para replicar esto en C, tendrías que recurrir a if / else o tratar las referencias directamente:

*(true ? &a : &b) = 1;

También en C ++, ?: Y = operadores tienen la misma precedencia y grupo de derecha a izquierda , de modo que:

(true ? a = 1 : b = 2);

es un código válido de C ++, pero lanzará un error en C sin paréntesis alrededor de la última expresión:

(true ? a = 1 : (b = 2));


La principal diferencia práctica es que en C, la evaluación de?: Nunca puede dar como resultado un valor de l donde, como en C ++, puede hacerlo.

Existen otras diferencias en su definición que tienen pocas consecuencias prácticas. En C ++, el primer operando se convierte en bool, en C se compara con 0. Esto es análogo a la diferencia en la definición de ==,! =, Etc. entre C y C ++.

También existen reglas más complejas en C ++ para deducir el tipo de una expresión?: Basada en los tipos de los operandos segundo y tercero. Esto refleja la posibilidad de conversiones implícitas definidas por el usuario en C ++.

Código de ejemplo C ++ válido; inválido C.

extern int h(int p, int q); int g(int x) { int a = 3, b = 5; (x ? a : b) = 7; return h( a, b ); }

gcc genera el error: "error: lvalue no válido en la asignación" al compilar como C, pero el código se compila sin error al compilar como C ++.

Editar: ¿Aunque?: No se puede devolver un valor l en C, tal vez sorprendentemente la gramática de?: Es:

conditional-expression: logical-OR-expression logical-OR-expression ? expression : conditional-expression

Esto significa que a ? b : c = d a ? b : c = d analiza como (a ? b : c) = d aunque (debido a la regla ''no un valor l'') esto no puede dar como resultado una expresión válida.

C ++ cambia la gramática a esto:

conditional-expression: logical-or-expression logical-or-expression ? expression : assignment-expression

Mientras que la extensión para permitir que la expresión condicional sea un valor l en algunas situaciones hubiera hecho a ? b : c = d a ? b : c = d válido sin el cambio de gramática, el nuevo cambio de gramática significa que la expresión ahora es válida pero con el diferente significado de a ? b : (c = d) a ? b : (c = d) .

Aunque no tengo ninguna evidencia para ello, mi suposición de que como el cambio de gramática no podía romper la compatibilidad con el código C existente, era más probable que la nueva gramática produjera menos sorpresas con expresiones como:

make_zero ? z = 0 : z = 1;