Поддержка современного языка + =, но не && = - PullRequest
6 голосов
/ 20 октября 2011

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

a += 5;  // increment a and assign result beack to a.

Но ни один из них (на который я смотрел (опять-таки небольшое число)), похоже, не поддерживает оператор && =.
Причина, по которой я спрашиваю, недавно видела это:

// simplified.
bool x = false;


x = x && testA(); // perform test A/B/C/D stop on first failure.
x = x && testB();
x = x && testC();
x = x && testD();

И мне было интересно, почему мы не могли использовать:

x &&= testA(); // perform test A/B/C/D stop on first failure.
x &&= testB();
x &&= testC();
x &&= testD();

Причина в том, что && = не поддерживается в C / C ++, что заставило нас задуматься, почему.

Есть ли логическая (без каламбура) причина, по которой язык поддерживает все другие основные операторы с формой присваивания, но не && = или || =

У меня есть смутные воспоминания об аргументах против них, но поиск в Google и SO затруднителен, когда ваш поисковый запрос - && = и в результате я ничего не нашел.

Ответы [ 5 ]

2 голосов
/ 20 октября 2011

Perl поддерживает это. Очень удобно иметь возможность писать:

$x ||= $defaultX;
1 голос
/ 20 октября 2011

&& и || являются особыми в том смысле, что в большинстве языков они являются единственными конструкциями, обеспечивающими оценку короткого замыкания, поэтому для них имеет смысл обращаться с ними иначе, чем с обычнымисхемы, операторы, когда дело доходит до сокращенных форм.Самый простой способ избежать путаницы с коротким замыканием &&= или нет - это не включать его в первую очередь.

1 голос
/ 20 октября 2011

Первая причина в том, что языки позволяют вам достичь своей цели, используя «многословную» форму. После этого он не одобряет добавление операторов для каждого необычного случая. Частично причина в том, что разработчик языка должен мудро выбирать приоритеты операторов. Это не так просто, как кажется - возьмем C в качестве примера, который испортил интуитивные приоритеты для &, |, && и ||.

Вторая причина в том, что большинство современных языков поддерживают некоторые формы исключений. Ваш случай может быть легко переписан с помощью исключений с дополнительным бонусом, чтобы информацию о сбое можно было легко передать вызывающей стороне.

Поэтому потребность в таком специальном операторе довольно мала.

О, я чуть не пропустил самую важную причину: у С их нет. Что это означает, лучше всего описано в Краткая, неполная и в основном неправильная история языков программирования :

1970 - Никлаус Вирт создает Паскаль, процедурный язык. Критики немедленно осудить Паскаль, потому что он использует синтаксис "x: = x + y" вместо более знакомого C-like "x = x + y". Это критика происходит несмотря на то, что C еще не был изобретен.

1972 - Деннис Ритчи изобретает мощное оружие, которое стреляет вперед и назад одновременно. Не удовлетворен количеством смертей и постоянные увечья от этого изобретения он изобретает С и Unix.

Это просто показывает, что C по-прежнему является аттрактором, от которого нельзя сбежать.

0 голосов
/ 26 октября 2011

В отличие от + = и друзей, && = не соответствует ни одной инструкции по оборудованию. Это своего рода проверка или прояснение.

0 голосов
/ 20 октября 2011

Когда тебе это понадобится? Обычно, когда вы выполняете логические операции, вы не обновляете значения, а скорее вычисляете что-то для одноразовой операции. Ваш пример не очень реалистичен; не так много случаев, когда вы действительно это сделаете.

Кроме того, во всех языках, которые я могу представить для расширенного присваивания, существует только для побитовых и арифметических операций, а не для логических операций.

...