Re[4]: Много отрицаний
От: Павел Кузнецов  
Дата: 27.06.05 17:31
Оценка:
0xDEADBEEF,

> E> Не лентяи программисты предпочитают определять всего один оператор '<'. А затем через него выводить и равенство, и неравенство и т.д.


> Неправда. Лентяи не знают что через '<' можно вывести равенство .


Более того, нелентяи знают, что есть разница между отношением эквивалентности, устанавливаемым двумя вызовами <, и равенством/неравенством, устанавливаемыми одним вызовом ==/!=.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Много отрицаний
От: 0xDEADBEEF Ниоткуда  
Дата: 27.06.05 19:32
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> Неправда. Лентяи не знают что через '<' можно вывести равенство .


ПК>Более того, нелентяи знают, что есть разница между отношением эквивалентности, устанавливаемым двумя вызовами <, и равенством/неравенством, устанавливаемыми одним вызовом ==/!=.


Ну-ка, ну-ка, с этого места и поподробнее. В чем же будет разница между отношениями эквивалентности и порядка при следующих условиях: если (a < b), то (a != b); если (b < a), то (a != b); ? Естественно, подразумевается что отношения эквивалентности коммутативны, а отношения порядка — нет.
__________
16.There is no cause so right that one cannot find a fool following it.
Re[6]: Много отрицаний
От: Павел Кузнецов  
Дата: 27.06.05 21:23
Оценка:
0xDEADBEEF,

> ПК>Более того, нелентяи знают, что есть разница между отношением эквивалентности, устанавливаемым двумя вызовами <, и равенством/неравенством, устанавливаемыми одним вызовом ==/!=.


> Ну-ка, ну-ка, с этого места и поподробнее.


Если есть некоторый предикат, задающий порядок, то далеко не обязательно из (a < b) == false && (b < a) == false следует (a == b) == true. Например, предикат, задающий case insensitive упорядочивание строк при case sensitive сравнении. И наоборот. Допустим, для некоторого класса чисел с плавающей точкой операция сравнения работает с учетом epsilon. В этом случае для двух очень близких чисел (с разницей в пределах epsilon) второе условие будет верно, а первое — нет.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[7]: Много отрицаний
От: 0xDEADBEEF Ниоткуда  
Дата: 28.06.05 11:46
Оценка:
Hello, Павел!
You wrote in conference rsdn.philosophy on Mon, 27 Jun 2005 21:23:45 GMT:

ПК> 0xDEADBEEF,


ПК>>> Более того, нелентяи знают, что есть разница между отношением эквивалентности, устанавливаемым двумя вызовами <, и

ПК>>> равенством/неравенством, устанавливаемыми одним вызовом ==/!=.

ПК>> Ну-ка, ну-ка, с этого места и поподробнее.


ПК> Если есть некоторый предикат, задающий порядок, то далеко не обязательно из

ПК> (a < b) == false && (b < a) == false следует (a == b) == true.
Это так в текущем стандарте STL. Там понятия эквивалентности и порядка не связаны.
То есть, формально ты прав.

Впрочем, остается еще один вопрос: Ist das gut? В смысле хорошо ли есть такое размежевание с математическими понятиями порядка и эквивалентности?

ЗЫ. В какой-то книжке (уж не Design & Evoloution of C++?) я читал по поводу стандартизации упорядоченных контейнеров.
Там приводились дискусии о критериях упорядочивания. Рассматривались предикаты 'bool operator<' и 'int compare(rhs)' аналогичный strcmp(). А вот rationale почему остановились на том на чем остановились я, увы, не помню.
Posted via RSDN NNTP Server 1.9
__________
16.There is no cause so right that one cannot find a fool following it.
Re: Много отрицаний
От: Ranger_XL  
Дата: 29.06.05 10:19
Оценка:
SAV>
SAV>if (str != null && str != "test")
SAV>    // ...
SAV>

SAV>рекомендуется привести к
SAV>
SAV>if ( !(str == null || str == "test") )
SAV>    // ...
SAV>


ИМХО, единственный случай, когда 2-ой вариант может быть предпочтительнее первого, если нас интересует постусловие завершения цикла.

while ( !(str == null || str == "test") ) {
   ...
}
// здесь у нас str == null || str == "test"
Re[4]: Много отрицаний
От: FDSC Россия consp11.github.io блог
Дата: 30.06.05 08:09
Оценка:
Здравствуйте, qxWork, Вы писали:

X>>Более того, первый вариант еще и в общем случае быстрее работает

W>ровно на 1 такт ))


Не фига.

1. Первый вариант в общем работает столько же, сколько и второй. Отрицание в самом операторе не реализуется машинной командой отрицания.

2. Второй вариант может сработать быстрее ровно на 1 такт. Если проверка первого значения сразу даст true, а компилятор работает с настройкой быстрого вычисления булевских выражений.
Re[2]: Много отрицаний
От: FDSC Россия consp11.github.io блог
Дата: 30.06.05 08:15
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, SiAVoL, Вы писали:


SAV>>
SAV>>if (str != null && str != "test")
SAV>>    // ...
SAV>>

SAV>>рекомендуется привести к
SAV>>
SAV>>if ( !(str == null || str == "test") )
SAV>>    // ...
SAV>>


СГ>Я бы рекомендовал код типа таких:

СГ>
СГ>if( (pointer != null) && (используем выражения с pointer зная что он точно не null) )
СГ>

СГ>
СГ>if( (array != null) && (array.Length >= N) && (используем выражения с array зная что он точно не null и что его длина точно >= N) )
СГ>


СГ>не превращать "тождественными" преобразованиями ни во что другое. Проверка выражений идет слева на право и если на каком-то шаге результат становится известным, то дальнейшая проверка "хвоста" не осуществляется.


Можно очень, очень, очень не хорошо попасть с настройками компилятора.

Впрочем я не против этого.
Re: Много отрицаний
От: ukshish  
Дата: 30.06.05 08:23
Оценка:
Здравствуйте, SiAVoL, Вы писали:

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

SAV>Т.е. например код
SAV>
SAV>if (str != null && str != "test")
SAV>    // ...
SAV>

SAV>рекомендуется привести к
SAV>
SAV>if ( !(str == null || str == "test") )
SAV>    // ...
SAV>


SAV>ИМХО, первый вариант несколько более читаем — не равно нул и не равно строке "test". Все ясно и понятно. Смысл же второго (по крайней мере мне) уже не так очевиден.

SAV>Понятно, что когда условие сложное, то большое количество отрицаний реально замедляет понимание кода. Но зачастую классики приводят примеры аналогичные моему и говорят, что второй вариант лучше.
SAV>Это именно особенности моего восприятия, или классики ошибаются, или я что-то недопонимаю?

Может, речь идёт об операторе "!". Оператор "!=" ничуть не хуже оператора "==". В итоге второй вариант как раз и содержит лишний "!".
Re[2]: Много отрицаний
От: FDSC Россия consp11.github.io блог
Дата: 30.06.05 09:02
Оценка:
Здравствуйте, ukshish, Вы писали:

U>Может, речь идёт об операторе "!". Оператор "!=" ничуть не хуже оператора "==". В итоге второй вариант как раз и содержит лишний "!".


Читать весь форум надо. Уже в самой первой ветке было сказано, что пример супер неудачный, а автор неправильно понял рекомендации
Re[2]: Много отрицаний
От: Oleg A. Bachin Украина  
Дата: 05.07.05 12:45
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Я бы рекомендовал код типа таких:

СГ>
СГ>if( (pointer != null) && (используем выражения с pointer зная что он точно не null) )
СГ>

СГ>
СГ>if( (array != null) && (array.Length >= N) && (используем выражения с array зная что он точно не null и что его длина точно >= N) )
СГ>


СГ>не превращать "тождественными" преобразованиями ни во что другое. Проверка выражений идет слева на право и если на каком-то шаге результат становится известным, то дальнейшая проверка "хвоста" не осуществляется.


помнится в свое время я был сильно удивлен, что в IB это не так
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.