Почему в 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
и вернуть егоВышеприведенные шаги кажутся одинаковыми как для назначения, так и для обычного случая.