Почему в C нет логического оператора присваивания?

Мне нужно было закодировать заявление в форме

a = a || expr;

гдеexpr должны быть оценены и результат должен быть назначенa тогда и только тогдаa не установлено. это основано на возможностях короткого замыкания логического ИЛИ.

Более короткий способ написания вышеизложенного будет, конечно,

a ||= expr;

но (к моему удивлению) C не имеет логических операторов присваивания.

Так что мой вопрос двоякий. Во-первых, есть ли более короткий способ написать первое утверждение в стандартном C (троичный оператор еще хуже -a = a ? a : expr требует от меня разобратьa трижды).

Во-вторых, почему нет логических назначений в C? Возможные причины, о которых я мог подумать:

это делает грамматику труднее разобрать?есть некоторая тонкость в обработке короткого замыкания для этих случаев?это считалось излишним (но разве это не аргумент против ВСЕХ назначений операторов?)

РЕДАКТИРОВАТЬ

Пожалуйста, разблокируйте этот вопрос, потому что:

Вопрос, с которым он был связан (как предполагаемый дубликат), НЕ ОТВЕЧЕН. (Принятый) ответ на этот вопрос гласит, что||= отсутствует, потому что дублирует функциональность|=, Это неправильный ответ.|= не закорачивает

C и C ++ НЕ являются одинаковыми языками. Я хочу знать, почему у С этого нет. Фактически, тот факт, что производные языки, такие как C ++ и, в частности, Java (который не страдал от проблем унаследованного кода, как было предложено в ответе Эдмунда), делает вопрос еще более интересным.

РЕДАКТИРОВАТЬ 2

Теперь кажется, что мое первоначальное намерение было неверным. В заявленииa = a || expr (гдеa является интегральным иexpr возвращает целое значение, сначала обаa а такжеexpr будет неявно преобразован в «логическое значение», а затем будет назначено «логическое» значениеa, Это будет неверно - интегральное значение будет потеряно. Спасибо, Дженс и Эдмунд.

Итак, для первой части вопроса, правильные пути, а не альтернативы :), кодировать мое намерение было бы:

if (!a) a = expr;

или же

a = a ? a : expr;

они должны быть оптимизированы одинаково (я думаю), хотя лично я предпочел бы первый (потому что он имеет один меньшеa печатать).

Однако вторая часть вопроса все еще остается. Аргументы, которые приводили Дженс и Эдмунд о неоднозначности вa ||= expr применять одинаково хорошо дляa = a || expr, случай назначения можно просто рассматривать как нормальный:

перерабатыватьa логическоеесли это правда, значение всего выражения становится равным логическому значениюaиначе оценитеexpr, преобразовать результат в логическое значение, присвоитьaи вернуть его

Вышеприведенные шаги кажутся одинаковыми как для назначения, так и для обычного случая.

Ответы на вопрос(4)

Ваш ответ на вопрос