| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Способы проверки диапазона для целого числа |
| Автор: zim22 25.6.2009, 18:52 | ||||||||||||||||
| Читаю "Совершенный Код" Макконнелла Не хочу соглашаться с ним в этом совете: Упорядочение числовых выражений в соответствии со значениями на числовой прямой в двух словах - его смысл в том, что необходимо слева от знака сравнения ставить константное число (к примеру), а неизвестную - справа. т.е. так:
проблема в том, что моему мозгу сложно понять это выражение чтобы его осмыслить, я разбираю это выражение за 3 шага:
если бы выражение в самом начале было записано как
то мне не пришлось бы выполнять 1 и 2 шаг. Я сразу бы "осознал" допустимый диапазон для x. в каком стиле вы предпочитаете писать логические условия? какой случай вам легче понять? согласны ли вы с Макконнелом? текст совета Макконнелла:
не для меня... |
| Автор: Andrew121 25.6.2009, 19:17 |
И моему. Как правило, такой вид записи, наблюдаю чаще всего в коде батаников/зазубриков/и еще людей, знающих что такое числовая ось. Так как опыт практического программирования у них крайне мал. |
| Автор: UnrealMan 25.6.2009, 19:22 |
А зачем к нестрогим неравенствам приводить? |
| Автор: GoldFinch 25.6.2009, 19:28 |
и еще людей, знающих что такое числовая ось. а ты видимо не знаешь. |
| Автор: Andrew121 25.6.2009, 19:39 |
Спасибо. Дополню. |
| Автор: zim22 25.6.2009, 20:00 | ||
незачем. у меня было предубеждение, что при инвертировании операндов в логическом условии необходимо добавлять или отнимать знак равенства например я думал так:
я ошибался. |
| Автор: Леопольд 25.6.2009, 20:00 | ||||||||||
Вам не кажется что он имел ввиду вот это?
Вполне понятно и не надо делать финт ушами. Но я предпочитаю так же как и Вы:
Хотя на самом деле мне одинаково понятно, что так, что эдак. Так что "по барабану"... |
| Автор: kemiisto 25.6.2009, 20:10 | ||||||
Это плохо. Незнание таких элементарных вещей... И поэтому, дальше, как отметил Леопольд, Вы ошиблись.
Именно так и рекомендует автор. Неплохой, кстати, совет. Добавлено через 2 минуты и 43 секунды zim22, у Вас в голове каша. Очень запущено. Там два разных случая по тексту. Первый - когда переменная принадлежит некому онранийченному замкнутому отрезок и это MIN_ELEMENT <= i and i <= MAX_ELEMENT. Второй, наоборот, переменная лежит вне такого отрезка и это i < MIN_ELEMENTS or MAX_ELEMENTS < i. Добавлено через 4 минуты и 16 секунд А понял! Леопольд тоже ошибся. Там or надо, а не and. А иначе бессмыслица. |
| Автор: Леопольд 25.6.2009, 20:15 | ||||
Опс... Не успел поправить... Добавлено через 4 минуты и 16 секунд
Нет. Даже не задумывался. А что, есть какие-то серьёзные выгоды, кроме красоты? Вот от паттернов проектирования выгоды весьма существенны... |
| Автор: zim22 25.6.2009, 20:26 | ||||||||
я понял эти два случая, спасибо. не соглашусь. Леопольд ошибся.
если конвертировать выражение в "понятный" для меня вид, то получим это:
скажите, как может x быть меньше нуля и одновременно больше 10? *** я думаю, если команда разработчиков включит эту рекомендацию в свои стандарты кодирования - будет меньше неразберихи в логических условиях и код будет быстрей читаться. ***
может быть наоборот: практический опыт у них очень большой? |
| Автор: kemiisto 25.6.2009, 20:46 | ||
Ага.
zim22, отбросим на секунду, то что в примере Леопольда будет пустое множество значений. Что понятнее:
Первый вариант. Ибо не надо дополнительных усилий, чтобы преобразовать его в двойное неравенство. А мы именно это математичсекую запись пытаемся закодировать. И с примером с or тоже самое. Этот ваш Макконнелл об этом и говорит. |
| Автор: GoldFinch 25.6.2009, 20:51 |
| zim22, поправь подпись, он Де Морган, а не "Деморган" |
| Автор: zim22 25.6.2009, 21:19 | ||||||||||
преобразование в двойное неравенство - это преобразование Де Моргана что-ли? мне никаких усилий не нужно, чтобы преобразовать любое логическое условие с двумя операндами и оператором ИЛИ или И. очень просто делается: отрицаем каждый операнд, меняем знак между операндами (И <=> ИЛИ) и отрицаем всё выражение. *** я понял, откуда было моё заблуждение! я не различал между собой два случая: 1) отрицание логического выражения 2) перестановка операндов в логическом выражении с левой стороны на правую от знака операнда т.е. если мы отрицаем логическое условие, то я правильно тогда предполагал. < меняется на >=, > на <= возьмём к примеру это:
отрицаем и получаем:
что равнозначно варианту:
т.е. > меняется на <= ***
Я придумал, как визуализировать такие выражения. Представлять у себя в голове прямоугольнички разного размера. 1) a < x два прямоугольника. a маленький. x большой 2)x < b ещё один прямоугольник представляю. самый большой. b что дальше с ними делать - не знаю http://xmages.net/show.php/296059_bb.gif.html поправил. хотя фамилию я не с головы придумал. в книжечке Совершенный Код он был написан именно как Деморган. Но корявый русский перевод мог иметь место. |
| Автор: kemiisto 25.6.2009, 21:26 | ||
Да нет. |
| Автор: zim22 25.6.2009, 21:41 | ||
теперь понятно, что вы имели ввиду |
| Автор: baldina 26.6.2009, 02:13 | ||
Макконнелла, признаюсь, не читал, но всю жизнь пишу
именно из тех соображений, что приводит kemiisto: это наиболее близко к привычному a < x < b Добавлено через 1 минуту и 33 секунды |
| Автор: Леопольд 26.6.2009, 08:36 | ||||||||||||||||
Я исправил её почти сразу после того как запостил... Или это уже не имеет значения?
Вообще очень хорошо смотрится
to fill - заполнить У меня дурная привычка, сначала запостить, потом минут 15 править ошибки, нет бы наоборот... |
| Автор: zim22 26.6.2009, 08:42 |
расшифруйте. у "to fill" миллион вариантов перевода *** книжка тяжёлая (1.5 кг). если по голове ударить - убить можно |