Операторы в С++
От: Евгений Коробко  
Дата: 10.06.03 12:07
Оценка: -1 :)
Есть какое-нибудь логическое объяснение, почему в С++ отсутствуют операторы:
&&=
||=
логическое XOR (^^ или что-то подобное)
Как-то несимметрично получается...
Евгений Коробко
Re: Операторы в С++
От: Lorenzo_LAMAS  
Дата: 10.06.03 12:09
Оценка:
А для чего, если не секрет, они Вам нужны? С примерами пожалуйста.
Of course, the code must be complete enough to compile and link.
Re[2]: Операторы в С++
От: Евгений Коробко  
Дата: 10.06.03 12:22
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>А для чего, если не секрет, они Вам нужны? С примерами пожалуйста.


Странный вопрос. Каждый бинарный оператор имеет соответствующий оператор с присваиванием. Исключение составляет лишь логические операторы || и &&.
Логическое XOR — это, по-моему, вообще очевидно.
Пример:

bool res=true;
for(int i=0;i<Size;i++) res&&=test_object(objs[i]);

Устроит?

Эти операторы (|| и &&) нужны для того же, для чего и +=,-=,*=,/=,<<=,>>=,&=,|=,^=. Для большей эстетичности, читаемости и оптимизации.

Убедил?
Евгений Коробко
Re[3]: Операторы в С++
От: sercher Украина  
Дата: 10.06.03 12:24
Оценка:
Вы, батенька, логические операторы с побитовыми не путайте, для разных целей всё-таки.
Re[4]: Операторы в С++
От: Lorenzo_LAMAS  
Дата: 10.06.03 12:31
Оценка:
S>Вы, батенька, логические операторы с побитовыми не путайте, для разных целей всё-таки.

Так он не путает. Ему хочется &&= для переменных типа bool.
Of course, the code must be complete enough to compile and link.
Re[5]: Операторы в С++
От: Евгений Коробко  
Дата: 10.06.03 12:35
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

S>>Вы, батенька, логические операторы с побитовыми не путайте, для разных целей всё-таки.


L_L>Так он не путает. Ему хочется &&= для переменных типа bool.


Совершенно верно. И совершенно непонятно, почему для логических операторов нет сдвоенных с присваиванием.
Я жуе не говорю про логический xor.
Конечно, можно сделать
inline bool Xor(bool x1,bool x2)
{
return (x1&&(!x2))||(x2&&(!x1))
}
Но, согласитель, некрасиво. И вряд ли эффективно.
Евгений Коробко
Re[6]: Операторы в С++
От: sercher Украина  
Дата: 10.06.03 12:53
Оценка: +1 -3 :)
Не городите ерунды. b ||= true равно true, b ||=false равно b. Во вторыхб b &&= false равно false и т.д.. Кому это надо писать эту чушь???
Re[7]: Операторы в С++
От: Ed.ward Россия  
Дата: 10.06.03 12:57
Оценка: +1
Здравствуйте, sercher, Вы писали:


S>Не городите ерунды. b ||= true равно true, b ||=false равно b. Во вторыхб b &&= false равно false и т.д.. Кому это надо писать эту чушь???


а
x ||= y и x &&= y

чему будет равно?

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[8]: Операторы в С++
От: sercher Украина  
Дата: 10.06.03 13:06
Оценка:
EW>x ||= y и x &&= y

EW>чему будет равно?



А зачем это надо??? Для каких целей? Что этим преследуется?
Re[9]: Операторы в С++
От: Аноним  
Дата: 10.06.03 13:14
Оценка:
S>А зачем это надо??? Для каких целей? Что этим преследуется?

Что значит "зачем"? Ты не видишь смысла в выражениях x = x || y и x = x && y ?
Вообще-то логические выражения бывают и посложнее.
Re[9]: Операторы в С++
От: Ed.ward Россия  
Дата: 10.06.03 13:17
Оценка:
Здравствуйте, sercher, Вы писали:

EW>x ||= y и x &&= y


EW>чему будет равно?



S>А зачем это надо??? Для каких целей? Что этим преследуется?


например так

bool result = false;
result &&= First();
result ||= Second();
result &&= Third();

if( result )
{
// ...
}


Соотвественно First, Second и Third функции анализирующие, скажем состояние объекта, ну и возвращающие значения типа bool.

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[10]: Операторы в С++
От: sercher Украина  
Дата: 10.06.03 13:29
Оценка:
EW>например так

EW>
EW>bool result = false;
EW>result &&= First();
EW>result ||= Second();
EW>result &&= Third();

EW>if( result )
EW>{
EW>// ...
EW>}
EW>


А чем это не устраивает:

int result = false;
result &= First();
result |= Second();
result &= Third();

if( result )
{
// ...
}


Re[11]: Операторы в С++
От: Евгений Коробко  
Дата: 10.06.03 13:34
Оценка:
Здравствуйте, sercher, Вы писали:

S>А чем это не устраивает:


S>[ccode]

S>int result = false;
S>result &= First();
S>result |= Second();
S>result &= Third();

Не надо путать битовые операции и логические.

2 & 4 == false (0)
2 && 4 == true

Это разные операции.
Евгений Коробко
Re[12]: Операторы в С++
От: sercher Украина  
Дата: 10.06.03 13:49
Оценка:
ЕК>Не надо путать битовые операции и логические.

ЕК>2 & 4 == false (0)

ЕК>2 && 4 == true

ЕК>Это разные операции.



Да, правда, но функции должны возвращать 1 или 0. А вообще всё это обходится так или иначе. И с использованием типа bool и без.
Re[12]: Операторы в С++
От: Stepkh  
Дата: 10.06.03 13:51
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>Здравствуйте, 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, что будет в результате?). Данный тип служит только для индикации того, что какое-то утверждение истинно или ложно и не более того. ("Я так думаю" (с) Мимино)
Re[13]: Операторы в С++
От: Евгений Коробко  
Дата: 10.06.03 14:26
Оценка:
S>Как мне кажется, эта проблема надумана. В каждом языке (и не только) происходят эволюционнные процессы, и уж за три десятка лет существования С/С++ такое предложение возникало неоднократно.
S>Но скорее всего оно не находило поддержки по простой причине: люди (т.е. программисты) не склоны производить ВЫЧИСЛЕНИЯ с булевскими типами (ну какой прок скажем от операции bool + bool или bool — bool, что будет в результате?). Данный тип служит только для индикации того, что какое-то утверждение истинно или ложно и не более того. ("Я так думаю" (с) Мимино)

конечно, bool+bool смысла не имеет. А вот bool && bool ещё как имеет.
Дело в том, что из С унаследована роль int как bool. Это приводит к некоторой путанице.

Это — не расширение С++. Вообще, когда я столкнулся с отсутствием этих операторов, я был удивлён.

А что касается "можно обойтись без этого" — понятное дело. Можно обойтись машиной Тьюринга.
Евгений Коробко
Re[6]: Операторы в С++
От: SergeyS  
Дата: 10.06.03 15:51
Оценка: 6 (2)
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>Я жуе не говорю про логический xor.

ЕК>Конечно, можно сделать
ЕК>inline bool Xor(bool x1,bool x2)
ЕК>{
ЕК> return (x1&&(!x2))||(x2&&(!x1))
ЕК>}
ЕК>Но, согласитель, некрасиво. И вряд ли эффективно.

Логический xor — это оператор !=
Xor = x1!=x2
Re: Операторы в С++
От: Андрей Тарасевич Беларусь  
Дата: 10.06.03 20:40
Оценка: 7 (2)
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>Есть какое-нибудь логическое объяснение, почему в С++ отсутствуют операторы:

ЕК> &&=
ЕК> ||=
ЕК> логическое XOR (^^ или что-то подобное)
ЕК>Как-то несимметрично получается...

Что касается логического XOR, то его отсутствие объясняется одним принципиальным отличием операции XOR от операций AND и OR — он не допускает сокращенного вычисления. Без сокращенного вычисления логический XOR быть с известной долей осторожности заменен оператором '!='. XOR это фактически и ест логическое '!='.

А вот операторов '&&=' и '||=' действительно не хватает.
Best regards,
Андрей Тарасевич
Re[14]: Операторы в С++
От: sercher Украина  
Дата: 11.06.03 05:13
Оценка: -2
ЕК>А что касается "можно обойтись без этого" — понятное дело. Можно обойтись машиной Тьюринга.

Да дело даже не в машине Тьюринга. Просто грамотные программисты всегда пишут так:


  if(IsFileOpen()){...}
  if(IsWindow()){...}
  if(Is...){}


А сама функция должна внутри содержать неоходимые проверки флагов. Причём ситуация когда пишется:


  bool res = F1();
  res = res && F2();
  res = res || F3();


Это уже плохо спланированная программа.
Re[15]: Операторы в С++
От: Stepkh  
Дата: 11.06.03 05:27
Оценка:
Здравствуйте, sercher, Вы писали:



S> А сама функция должна внутри содержать неоходимые проверки флагов. Причём ситуация когда пишется:


S>

S>  bool res = F1();
S>  res = res && F2();
S>  res = res || F3();
S>


S> Это уже плохо спланированная программа.


Поддержу предыдущего оратора:

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


if ((F1 && F2) || F3)


любому читающему будет понятен смысл данного утверждения. А о коде приведенном выше сказать однозначно нельзя какой смылс заложен в это условие.
Хотя иногда возникает необходимость раздробить условие на составные части (если он сильно длинное), но лично я все логические проверки провожу в блоке if (). Так для меня нагляднее и ясно читается мысль
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.