¿Por qué C no tiene un operador de asignación lógica?

Tuve la necesidad de codificar una declaración del formulario

a = a || expr;

dóndeexpr debe ser evaluado y el resultado asignado aa iffa no está configurado esto se basa en las capacidades de cortocircuito del OR lógico.

La forma más corta de escribir lo anterior sería, por supuesto, ser

a ||= expr;

pero (para mi sorpresa) C no tiene operadores de asignación lógica.

Entonces mi pregunta es doble. Primero, ¿hay una forma más corta de escribir la primera declaración en el estándar C (el operador ternario es aún peor:a = a ? a : expr requiere que expliquea tres veces).

En segundo lugar, ¿por qué no hay asignaciones lógicas en C? Las posibles razones que se me ocurren son:

hace que la gramática sea más difícil de analizar?¿Hay alguna sutileza en el manejo de cortocircuitos para estos casos?se consideró superfluo (pero ¿no es eso un argumento en contra de TODAS las asignaciones de operadores?)

EDITAR

Desbloquee esta pregunta porque:

La pregunta a la que se ha vinculado (como un supuesto duplicado de) NO SE HA RESPONDIDO. La respuesta (aceptada) a esa pregunta establece que||= no está presente porque duplica la funcionalidad de|=. Esa es la respuesta incorrecta.|= no hace corto circuito.

C y C ++ NO son los mismos lenguajes. Deseo saber por qué C no lo tiene. De hecho, el hecho de que lenguajes derivados como C ++ y, en particular, Java (que no sufrieron los problemas del código heredado como se sugirió en la respuesta de Edmund) hace que la pregunta sea aún más interesante.

EDITAR 2

Ahora parece que mi intención original estaba equivocada. En la declaracióna = a || expr (dóndea es integral yexpr devuelve un valor integral, primero ambosa yexpr se convertirá implícitamente a "booleanos", y luego se asignará el valor "booleano" aa. Esto será incorrecto: se perderá el valor integral. Gracias Jens y Edmund.

Entonces, para la primera parte de la pregunta, las formas correctas, no alternativas :), para codificar mi intención serían:

if (!a) a = expr;

o

a = a ? a : expr;

deberían optimizarse de la misma manera (creo), aunque personalmente preferiría el primero (porque tiene uno menosa digitar).

Sin embargo, la segunda parte de la pregunta aún permanece. Los argumentos que Jens y Edmund han dado sobre la ambigüedad ena ||= expr aplicar igualmente bien aa = a || expr. el caso de asignación simplemente puede tratarse como el normal:

convertira a booleanosi es cierto, el valor de toda la expresión se vuelve igual al valor booleano deade lo contrario evaluarexpr, convertir resultado a booleano, asignar aay devolverlo

Los pasos anteriores parecen ser los mismos tanto para la asignación como para el caso normal.

Respuestas a la pregunta(4)

Su respuesta a la pregunta