Есть какое-нибудь логическое объяснение, почему в С++ отсутствуют операторы:
&&=
||=
логическое XOR (^^ или что-то подобное)
Как-то несимметрично получается...
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>А для чего, если не секрет, они Вам нужны? С примерами пожалуйста.
Странный вопрос. Каждый бинарный оператор имеет соответствующий оператор с присваиванием. Исключение составляет лишь логические операторы || и &&.
Логическое XOR — это, по-моему, вообще очевидно.
Пример:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
S>>Вы, батенька, логические операторы с побитовыми не путайте, для разных целей всё-таки.
L_L>Так он не путает. Ему хочется &&= для переменных типа bool.
Совершенно верно. И совершенно непонятно, почему для логических операторов нет сдвоенных с присваиванием.
Я жуе не говорю про логический xor.
Конечно, можно сделать
inline bool Xor(bool x1,bool x2)
{
return (x1&&(!x2))||(x2&&(!x1))
}
Но, согласитель, некрасиво. И вряд ли эффективно.
Здравствуйте, sercher, Вы писали:
S>А чем это не устраивает:
S>[ccode] S>int result = false; S>result &= First(); S>result |= Second(); S>result &= Third();
Здравствуйте, Евгений Коробко, Вы писали:
ЕК>Здравствуйте, sercher, Вы писали:
S>>А чем это не устраивает:
S>>[ccode] S>>int result = false; S>>result &= First(); S>>result |= Second(); S>>result &= Third();
ЕК>Не надо путать битовые операции и логические.
ЕК>2 & 4 == false (0) ЕК>2 && 4 == true
ЕК>Это разные операции.
Как мне кажется, эта проблема надумана. В каждом языке (и не только) происходят эволюционнные процессы, и уж за три десятка лет существования С/С++ такое предложение возникало неоднократно.
Но скорее всего оно не находило поддержки по простой причине: люди (т.е. программисты) не склоны производить ВЫЧИСЛЕНИЯ с булевскими типами (ну какой прок скажем от операции bool + bool или bool — bool, что будет в результате?). Данный тип служит только для индикации того, что какое-то утверждение истинно или ложно и не более того. ("Я так думаю" (с) Мимино)
S>Как мне кажется, эта проблема надумана. В каждом языке (и не только) происходят эволюционнные процессы, и уж за три десятка лет существования С/С++ такое предложение возникало неоднократно. S>Но скорее всего оно не находило поддержки по простой причине: люди (т.е. программисты) не склоны производить ВЫЧИСЛЕНИЯ с булевскими типами (ну какой прок скажем от операции bool + bool или bool — bool, что будет в результате?). Данный тип служит только для индикации того, что какое-то утверждение истинно или ложно и не более того. ("Я так думаю" (с) Мимино)
конечно, bool+bool смысла не имеет. А вот bool && bool ещё как имеет.
Дело в том, что из С унаследована роль int как bool. Это приводит к некоторой путанице.
Это — не расширение С++. Вообще, когда я столкнулся с отсутствием этих операторов, я был удивлён.
А что касается "можно обойтись без этого" — понятное дело. Можно обойтись машиной Тьюринга.
Здравствуйте, Евгений Коробко, Вы писали:
ЕК>Я жуе не говорю про логический xor. ЕК>Конечно, можно сделать ЕК>inline bool Xor(bool x1,bool x2) ЕК>{ ЕК> return (x1&&(!x2))||(x2&&(!x1)) ЕК>} ЕК>Но, согласитель, некрасиво. И вряд ли эффективно.
Здравствуйте, Евгений Коробко, Вы писали:
ЕК>Есть какое-нибудь логическое объяснение, почему в С++ отсутствуют операторы: ЕК> &&= ЕК> ||= ЕК> логическое XOR (^^ или что-то подобное) ЕК>Как-то несимметрично получается...
Что касается логического XOR, то его отсутствие объясняется одним принципиальным отличием операции XOR от операций AND и OR — он не допускает сокращенного вычисления. Без сокращенного вычисления логический XOR быть с известной долей осторожности заменен оператором '!='. XOR это фактически и ест логическое '!='.
А вот операторов '&&=' и '||=' действительно не хватает.
S> А сама функция должна внутри содержать неоходимые проверки флагов. Причём ситуация когда пишется:
S>
S> bool res = F1();
S> res = res && F2();
S> res = res || F3();
S>
S> Это уже плохо спланированная программа.
Поддержу предыдущего оратора:
в коде приведенном выше неясно как должны выполняться логические условия (здесь правда можно сказать что это сила привычки и т.д.):
if ((F1 && F2) || F3)
любому читающему будет понятен смысл данного утверждения. А о коде приведенном выше сказать однозначно нельзя какой смылс заложен в это условие.
Хотя иногда возникает необходимость раздробить условие на составные части (если он сильно длинное), но лично я все логические проверки провожу в блоке if (). Так для меня нагляднее и ясно читается мысль