if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: Shmj Ниоткуда  
Дата: 19.11.15 15:04
Оценка: :))
Пример:

            int i = 0;
            while (true)
            {
                Console.WriteLine(i);
                i++;

                // вариант 1
                //if (i >= 5)
                //    break;

                // вариант 2
                if (i == 5)
                    break;
            }


Смысл ясен: если i больше или равно 5, то цикл нужно завершить.

Однако i не может стать больше 5, пока не достигнет значения 5. По этому можно сократить и применить операцию не >= а просто ==.

С точки зрения области допустимых значений правильнее написать >=. Но имеет ли смысл, если больше никогда не будет? Тогда уж и < 0 нужно включить (так, на всякий случай).

Как вы пишите в таких случаях >= или == ? Почему?
Re: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: Evgeny.Panasyuk Россия  
Дата: 19.11.15 15:15
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>С точки зрения области допустимых значений правильнее написать >=. Но имеет ли смысл, если больше никогда не будет? Тогда уж и < 0 нужно включить (так, на всякий случай).


Есть пример проще: for(int i=0; i!=N; ++i)

S>Как вы пишите в таких случаях >= или == ? Почему?


Предпочитаю "==", так как позволяет поймать ошибку намного раньше.
Если же нет уверенности в логике кода, то нужно не молча проглатывать ошибки через ">=", а например в дополнение к "==" поставить отдельный assert(i <= 5).

P.S. Старые автовекторизаторы вели себя по-разному на подобных условиях, поэтому нужно было учитывать ещё и этот момент.
Отредактировано 22.11.2015 18:31 Evgeny.Panasyuk . Предыдущая версия .
Re: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.11.15 15:16
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Однако i не может стать больше 5, пока не достигнет значения 5. По этому можно сократить и применить операцию не >= а просто ==.


А чем это "сокращение"?

S>С точки зрения области допустимых значений правильнее написать >=. Но имеет ли смысл, если больше никогда не будет? Тогда уж и < 0 нужно включить (так, на всякий случай).


S>Как вы пишите в таких случаях >= или == ? Почему?


Если i — плавучее, то только на неравенство. Причём сравнивать, как для данного случая, не с 5, а с 5.5.
Если целое, то компилятор всё равно переделает по-своему, если решит, что i со стороны никто не меняет. По крайней мере, компиляторы для C/C++ позволяют себе такое править свободно. Для C# — не знаю, наверно, не переделает.
Re: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: VTT http://vtt.to
Дата: 19.11.15 15:23
Оценка:
Я напишу if(5 == i) и ассерты, проверяющие выход за диапазон.
Если это какое-то особо ответственное место, то проверку выхода за диапазон можно и в релизе делать.
Вот недавно была статья про Cfront, там как раз такие параноидальные проверки.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Отредактировано 19.11.2015 15:24 VTT . Предыдущая версия .
Re: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 19.11.15 15:40
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Как вы пишите в таких случаях >= или == ? Почему?


Когда как. Обычно всё-таки

for (int i=0; i<N; ++i)


При работе с STL стараюсь использовать равенство, потому как в случае кода

if (cit == conrainer.end())


достаточно при изменении типа container, например, c vector на set, придётся менять меньше кода. И это на моей памяти единственный случай, когда это оказывало хоть какое-то влияние на будущее.
Re: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: vsb Казахстан  
Дата: 19.11.15 15:50
Оценка: +7
Здравствуйте, Shmj, Вы писали:

S>Как вы пишите в таких случаях >= или == ? Почему?


Пишу >=. Считаю это более надёжным кодом в случае дальнейших модификаций: во-первых тип может поменяться на плавающий; во-вторых шаг может стать больше единицы; в-третьих переменную-итератор возможно в будущем кто-нибудь модифицирует. В идеале надо бы писать if (i > N) throw new AssertionError(); и сравнивать через ==, но это уже чересчур много писанины, минусов в таком подходе больше, чем плюсов.
Re[2]: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: Константин Россия  
Дата: 19.11.15 17:05
Оценка: +1
Здравствуйте, Mystic, Вы писали:

M>При работе с STL стараюсь использовать равенство, потому как в случае кода


M>
if (cit == conrainer.end())


Раз речь об STL, то там явно работать с индексами, итераторами редко нужно. Большую часть покрывает range-based for и алгоритмы типа std::for_each
Re[2]: Линейный порядок
От: Qbit86 Россия
Дата: 19.11.15 18:11
Оценка: 1 (1) +2
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Есть пример проще: for(int i=0; i!=N; ++i)


Раз уж мы в ветке Философия, то предложу свои загоны.

Почему мы в цикле с целыми числами пишем «!=» а не «<»? Для единообразия, потому что так мы пишем в цикле с итераторами.
Почему мы в цикле с итераторами пишем «!=» а не «<»? (Потому что читай «Начала программирования» Степанова.) Потому что не для всех типов итераторов нужно отношение линейного порядка.
Обычная программистская философия: код становится более общим, если не требовать от используемых типов больше, чем тебе нужно. Работать через минимально конкретные интерфейсы.

Так и здесь: зачем мне требовать от множества целых чисел интерфейс кольца с отношением линейного порядка, если в данный момент достаточно менее сильного интерфейса — всего лишь группы (или даже моноида) с отношением эквивалентности.
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Линейный порядок
От: Evgeny.Panasyuk Россия  
Дата: 19.11.15 20:02
Оценка:
Здравствуйте, Qbit86, Вы писали:

EP>>Есть пример проще: for(int i=0; i!=N; ++i)

Q>Раз уж мы в ветке Философия, то предложу свои загоны.
Q>Почему мы в цикле с целыми числами пишем «!=» а не «<»? Для единообразия, потому что так мы пишем в цикле с итераторами.
Q>Почему мы в цикле с итераторами пишем «!=» а не «<»? (Потому что читай «Начала программирования» Степанова.) Потому что не для всех типов итераторов нужно отношение линейного порядка.
Q>Обычная программистская философия: код становится более общим, если не требовать от используемых типов больше, чем тебе нужно.

Полностью согласен, это тоже аргумент.

Q>Работать через минимально конкретные интерфейсы.


Лишь немного дополню капитанством: тот же Степанов за то чтобы использовать более конкретные интерфейсы — там где это необходимо / имеет смысл / даёт преимущества.

Q>если в данный момент достаточно менее сильного интерфейса — всего лишь группы (или даже моноида)


Даже не моноид, а магма — не нужен ни нулевой элемент, ни ассоциативность. И думаю там даже не магма — нет замкнутости, так как переполнение int в C++ это undefined behaviour, но это уже частности.
Отредактировано 19.11.2015 20:02 Evgeny.Panasyuk . Предыдущая версия .
Re[3]: Линейный порядок
От: alpha21264 СССР  
Дата: 19.11.15 21:49
Оценка: :))
Здравствуйте, Qbit86, Вы писали:

Q>Почему мы в цикле с целыми числами пишем «!=» а не «<»? Для единообразия, потому что так мы пишем в цикле с итераторами.

Q>Почему мы в цикле с итераторами пишем «!=» а не «<»? (Потому что читай «Начала программирования» Степанова.) Потому что не для всех типов итераторов нужно отношение линейного порядка.
Q>Обычная программистская философия: код становится более общим, если не требовать от используемых типов больше, чем тебе нужно. Работать через минимально конкретные интерфейсы.

Ох уж эти философы!
А потом будем как первоклассники ловить зацикливание программы на ровном месте.
http://s19.rimg.info/0871fde0709f1bd37b3b012eb22a4583.gif
Течёт вода Кубань-реки куда велят большевики.
Re[2]: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: Khimik  
Дата: 20.11.15 05:50
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, Shmj, Вы писали:


S>>Как вы пишите в таких случаях >= или == ? Почему?


vsb>Пишу >=. Считаю это более надёжным кодом в случае дальнейших модификаций: во-первых тип может поменяться на плавающий; во-вторых шаг может стать больше единицы; в-третьих переменную-итератор возможно в будущем кто-нибудь модифицирует.


Третий пункт, если я правильно понял, о том, что в теле цикла могут изменить итератор, например чтобы перепрыгнуть через шаг. Раз в исходном примере не for, a while, значит как раз для этого.
http://files.rsdn.org/77557/rocksm.png
Re[3]: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: vsb Казахстан  
Дата: 20.11.15 07:21
Оценка:
Здравствуйте, Khimik, Вы писали:

S>>>Как вы пишите в таких случаях >= или == ? Почему?


vsb>>Пишу >=. Считаю это более надёжным кодом в случае дальнейших модификаций: во-первых тип может поменяться на плавающий; во-вторых шаг может стать больше единицы; в-третьих переменную-итератор возможно в будущем кто-нибудь модифицирует.


K>Третий пункт, если я правильно понял, о том, что в теле цикла могут изменить итератор, например чтобы перепрыгнуть через шаг. Раз в исходном примере не for, a while, значит как раз для этого.


Да и в for-е менять никто не запрещает.
Re: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: andy1618 Россия  
Дата: 21.11.15 01:30
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Как вы пишите в таких случаях >= или == ? Почему?


Если речь не идет о космических устройствах, где вполне вероятны само-модификации памяти , то
я за использование == и последующего ассерта (i < 5).
Главное соображение — понятность замысла автора для других.
Re[4]: Линейный порядок
От: pagid Россия  
Дата: 21.11.15 15:31
Оценка: +1
Здравствуйте, alpha21264, Вы писали:

A>Ох уж эти философы!

+1
A>А потом будем как первоклассники ловить зацикливание программы на ровном месте.
Зацикливание в этом случае может быть результом ошибки в алгоритме или в реализации, пусть ошибка проявится зацикливанием, это может оказаться не самым худшим вариантом.

P.S. пишу for(int i=0; i<N; i++), полагая такую запись более привычной (для меня) именно для "for", в примере ТС наверно написал бы "if(i==5) break;" Рассуждения про отношение линейного порядка у разных типов итераторов совершенно избыточны в этих ситуация, разговор про i++ vs. ++i туда же.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re: if (i >= 5) vs if (i == 5) -- верите ли вы компьютеру?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 22.11.15 18:04
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Как вы пишите в таких случаях >= или == ? Почему?

Пишу >= когда значение должно быть не меньше, чем заданное. Например в цикле ожидания, пофигу сколько прошло итераций, важно чтобы меньше 100.
Пишу == когда требуется строгое равенство, например в массиве должно быть ровно 5 элементов, не 6 и не 4.

Если же цикл получился сложный и я не уверен, что инвариант (i<N) выполняется всегда, то лучше написать Debug.Assert(i<N), а не играться с условиями выхода.
Замена == на >= может банально скрыть ошибку в логике.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.