Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Стандартная ситуация: есть некоторая числовая переменная val которая инкриментируется в цикле while. Условием выхода из цикла является достижение значением переменной val некоторого максимального значения max. В учебниках в этом случае обычно используют следующий код: Код: plaintext 1. 2. 3. 4. 5. 6. Но почему собственно в условии цикла используется проверка на неравенство, а не проверка на меньше (val < max), ведь последний вариант более надёжен? Допустим в ходе выполнения цикла происходит сбой (ошибка в коде, сбой в работе компилятора, аппаратный сбой и т. д.) и итерация на которой val == max пропускается или проверка условия выполняется с ошибкой, тогда цикл, автоматически становиться бесконечным. Если же используется проверка на меньше, то цикл завершиться на следующей итерации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 19:57 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Если будет Код: plaintext 1. то некоторые компиляторы будут ворнинги писать. в остальном пофиг, оба варианта идентичны если max имеет тот же тип что и val. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 20:10 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Если max равен нулю то тело цикла вообще не выполнится в обоих случаях.сравнение через оператор < имхо более наглядное, те понятно что переменная val изначально меньше max и должна по логике к нему стремиться. В остальном обе проверки эквивалентны и можно использовать оба варианта. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 21:01 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NET Код: plaintext 1. 2. 3. 4. 5. 6. Но почему собственно в условии цикла используется проверка на неравенство, а не проверка на меньше (val < max), ведь последний вариант более надёжен? Зависит от того что такое max. Если это константа - оба варианта хороши. Если max вычисляется, возможно и с участием пользовательских данных, то нет гарантии что оно не уйдет в отрицательные значения. Тогда однозначно val < max ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 21:32 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NETСтандартная ситуация: есть некоторая числовая переменная val которая инкриментируется в цикле while. Условием выхода из цикла является достижение значением переменной val некоторого максимального значения max. В учебниках в этом случае обычно используют следующий код: Код: plaintext 1. 2. 3. 4. 5. 6. стандартной ситуацией на Си/С++ в данном случае скорее будет использование оператора for, по причине наличия всех трёх блоков такого вида операторов. .NET Если же используется проверка на меньше, то цикл завершиться на следующей итерации. в первом случае, когда, как вы говорите, программа будет выполнять бесконечно, будет понятно о том что произошел какой-то сбой, что-то не так. В данном случае мы об этом не узнаем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 01:55 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NET, Лучше тогда у тех авторов спросить. Может их в детстве мучили множествами, у которых отсутствует оператор "<". Для унификации или по привычке везде теперь пишут "!=", он-то на всём применим. В общем, мне непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 06:14 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryстандартной ситуацией на Си/С++ в данном случае скорее будет использование оператора for, по причине наличия всех трёх блоков такого вида операторов. Да, истинный программист C/C++, побуждаемый желанием сэкономить количество дырочек на перфокарте, написал бы так: Код: plaintext 1. 2. 3. 4. 5. SashaMercuryв первом случае, когда, как вы говорите, программа будет выполнять бесконечно, будет понятно о том что произошел какой-то сбой, что-то не так. В данном случае мы об этом не узнаем. Если программа постоянно взаимодействует с пользователем, то да, а если это сервис? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 08:58 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Такой код компилируется с предупреждениями Код: plaintext 1. 2. 3. 4. 5. 6. Если поставить != ворнинга нет. И не зря компилятор предупреждает, т.к. данный пример сработает по-разному при < и !=. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 09:29 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NETSashaMercuryстандартной ситуацией на Си/С++ в данном случае скорее будет использование оператора for, по причине наличия всех трёх блоков такого вида операторов. Да, истинный программист C/C++, побуждаемый желанием сэкономить количество дырочек на перфокарте, написал бы так: Код: plaintext 1. 2. 3. 4. 5. Этот участок кода не эквивалентен вашему первому варианту Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 10:03 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NET Если программа постоянно взаимодействует с пользователем, то да, а если это сервис? Зачем эти ограничения ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 10:04 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
SashaMercury.NET Если программа постоянно взаимодействует с пользователем, то да, а если это сервис? Зачем эти ограничения ? Чтобы разобраться во всех ли случаях вариант с использованием != однозначно лучше. Dima TТакой код компилируется с предупреждениями Код: plaintext 1. 2. 3. 4. 5. 6. Если поставить != ворнинга нет. И не зря компилятор предупреждает, т.к. данный пример сработает по-разному при < и !=. Да, это интересно, получается -1. Сравнение беззнакового числа с отрицательным возвращает false. Интересно, это прописано в стандарте или общепринятая практика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 10:29 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NETДа, это интересно, получается -1. Сравнение беззнакового числа с отрицательным возвращает false. Интересно, это прописано в стандарте или общепринятая практика? Должно быть прописано в приведении типов. Тут знаковый тип приводится к беззнаковому, что фактически сводится просто к тому что int берется как unsigned int без каких либо изменений самого значения, для положительных это нормально, для отрицательных - нет, т.к. -1 хранится как 0xFFFFFFFF что > 100. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 10:52 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Dima T, Да есть такое 6.5.8 Relational operators3. If both of the operands have arithmetic type, the usual arithmetic conversions are performed. 6.3.1.8 Usual arithmetic conversionsIf both operands have the same type, then no further conversion is needed. Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank. Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 11:07 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Dima T.NETДа, это интересно, получается -1. Сравнение беззнакового числа с отрицательным возвращает false. Интересно, это прописано в стандарте или общепринятая практика? Должно быть прописано в приведении типов. Тут знаковый тип приводится к беззнаковому, что фактически сводится просто к тому что int берется как unsigned int без каких либо изменений самого значения, для положительных это нормально, для отрицательных - нет, т.к. -1 хранится как 0xFFFFFFFF что > 100. Не всегда попробуй так Код: plaintext 1. 2. 3. 4. 5. 6. 7. преобразование выполняется по 6.3.1.8 "Usual arithmetic conversions" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 11:09 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Я почему-то ошибочно предполагал, что наоборот беззнаковый должен преобразовываться в знаковый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 11:12 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
YesSqlDima Tпропущено... Должно быть прописано в приведении типов. Тут знаковый тип приводится к беззнаковому, что фактически сводится просто к тому что int берется как unsigned int без каких либо изменений самого значения, для положительных это нормально, для отрицательных - нет, т.к. -1 хранится как 0xFFFFFFFF что > 100. Не всегда попробуй так Код: plaintext 1. 2. 3. 4. 5. 6. 7. преобразование выполняется по 6.3.1.8 "Usual arithmetic conversions" Ну это понятно если размер знакового больше, то преобразуется в знаковый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 11:14 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NETЯ почему-то ошибочно предполагал, что наоборот беззнаковый должен преобразовываться в знаковый. Только если все значения беззнакового типа помещаются в знаковый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 11:14 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
В С# по другому сделано. Если знаковый складывается с максимальным по рангу беззнаковым (ulong), то вызывается исключение. Если складываются знаковый и беззннаковый (не ulong) одного ранга, то оба аргумента приводятся к знаковому следующего ранга. Таким образом знак никогда не теряется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 16:21 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
C# похоже к Int64 приводит оба. так работает правильно Код: c# 1. 2. 3. 4. 5. 6. а так ошибка компиляции Код: c# 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 16:51 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
С не C# тебе warning выдали а дальше сам решай: хочешь к большему приводи, хочешь тип меняй, хочешь != поставь. Приведение операция хоть и быстрая, но все-равно не бесплатная. И потом x32 приложения не быстро работают с Int64, т.к. нет 64-битных регистров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 16:58 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Dima Tт.к. нет 64-битных регистров. xmm регистры вполне пригодны для целочисленных вычислений. и 64, и 128 бит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 17:06 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Dima Tx32 приложения не быстро работают с Int64, т.к. нет 64-битных регистров Есть. И даже 128-битные есть. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 17:07 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Тогда хз почему тормозит Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. x86 работает 5,4 сек, x64 - 5,0 сек. MSVC 2015 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 17:27 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
чуть модифицировал тест для наглядности Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. PS странно что если int64 и i < 10000000000, то разбег незначительный, x86 - 5,4 сек, x64 - 5,0 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 17:58 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Я-бы в большем отдавал предпочтение проверке на '<' (меньше) т.к. она более строгая и математически чистая. При миграции алгоритма к примеру в диапазон double или в численный метод мы по крайней мере сможем обезопасить себя от вылетания за границу расчётов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 18:29 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Мне кажется, что такая нотация идёт из обобщённых алгоритмов STL. Если у тебя while(i != j) {... ++j;}, то для изменения порядка обхода (произвольной) структуры с прямого на обратный не потребуется ничего менять в алгоритме - только подай в шаблон reverse iterator вместо обычного forward iterator. А вот с '<' вместо '!=' так уже не получится... так сказать, расплата за "гибкость-универсальность". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 22:38 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
BagaBagaМне кажется, что такая нотация идёт из обобщённых алгоритмов STL.скорее всего, ибо на некоторых итераторах оператор < не реализуется, а оператор != - допустим всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2016, 00:26 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NET Чтобы разобраться во всех ли случаях вариант с использованием != однозначно лучше. Давайте разберёмся во всех случаях. В вашем случае инкремент равен единице. В других случаях он может быть практически любым. Вы рассматриваете только один вариант из очень большого числа(пусть он и встречается столько раз, как все остальные вместе взятые), потому никаких выводов делать пожалуй не стоит. А эту историю с signed/unsigned знаю даже, далеко не самый опытный в Си человек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2016, 01:41 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
SashaMercury.NET Чтобы разобраться во всех ли случаях вариант с использованием != однозначно лучше. Давайте разберёмся во всех случаях. В вашем случае инкремент равен единице. В других случаях он может быть практически любым. Вы рассматриваете только один вариант из очень большого числа(пусть он и встречается столько раз, как все остальные вместе взятые), потому никаких выводов делать пожалуй не стоит. Пожалуй что не стоит, ведь может быть не инкремент, а декримент, и тогда вообще надо открывать новую тему. Просто хотелось понять предпочтение авторов учебников (хотя вообще есть ли оно) операции "!=" над операцией "<" это вопрос больше методический или практический. SashaMercuryА эту историю с signed/unsigned знаю даже, далеко не самый опытный в Си человек Да я тоже "знаю" но периодически забываю, так как программировал профессионально только на C#, а там всё наоборот, т. е. если в выражении участвует знаковый и беззнаковый, то оба приводятся к знаковому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2016, 12:13 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
egorychBagaBagaМне кажется, что такая нотация идёт из обобщённых алгоритмов STL.скорее всего, ибо на некоторых итераторах оператор < не реализуется, а оператор != - допустим всегда. Та же история что и с постфиксным и префиксным инкрементом для числовых всё равно ++x или x++, а для итераторов нет, поэтому считается что писать ++x предпочтительнее в любых случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2016, 12:19 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
В одном учебнике пишут, что использование "val != max" предпочтительнее "val < max", потому что в этом случае мы будем уверены, что после выполнения цикла val будет в точности равно мах, во втором случае оно может быть и больше. Другими словами "val != max" явно декларирует, что в результате работы цикла не предполагается ни в каком случае выход val за границу max. Это упрощает понимание кода, тому кто будет читать его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2016, 22:33 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NETВ одном учебнике пишут, что использование "val != max" предпочтительнее "val < max", потому что в этом случае мы будем уверены, что после выполнения цикла val будет в точности равно мах, во втором случае оно может быть и больше. Другими словами "val != max" явно декларирует, что в результате работы цикла не предполагается ни в каком случае выход val за границу max. Это упрощает понимание кода, тому кто будет читать его.Что значит упрощает понимание? А с чего вдруг человек увидевший while(val < max) должен думать что по выходу из цикла val==max??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2016, 23:19 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NET, нарисуй вещественную ось. И покрытие двух условий. Одно из них - это выколотая точка. Другое - луч от точки до бесконечности не включая саму точку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2016, 23:49 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NETВ одном учебнике пишут А что за учебник ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2016, 01:46 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
White Owl.NETВ одном учебнике пишут, что использование "val != max" предпочтительнее "val < max", потому что в этом случае мы будем уверены, что после выполнения цикла val будет в точности равно мах, во втором случае оно может быть и больше. Другими словами "val != max" явно декларирует, что в результате работы цикла не предполагается ни в каком случае выход val за границу max. Это упрощает понимание кода, тому кто будет читать его.Что значит упрощает понимание? А с чего вдруг человек увидевший while(val < max) должен думать что по выходу из цикла val==max??? Он и не будет так думать (будет находиться в неведении), если использовать val < max. Он будет думать (уверен), что val==max, если используется val != max. Поэтому если по задумке программиста пишущего код val не должен выходить за границу max, то и не стоит давать читающему код повода так думать используя val < max в условии выхода из цикла. SashaMercuryА что за учебник ? Accelerated C++ Andrew Koening, Barbara Moo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2016, 10:14 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
Процитируйте пожалуйста, если вас не сильно затруднит. Первый автор известный товарищ, только фамилия у него Koenig, если не ошибаюсь, а второго я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2016, 10:26 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NETWhite Owlпропущено... Что значит упрощает понимание? А с чего вдруг человек увидевший while(val < max) должен думать что по выходу из цикла val==max??? Он и не будет так думать (будет находиться в неведении), если использовать val < max. Он будет думать (уверен), что val==max, если используется val != max. Поэтому если по задумке программиста пишущего код val не должен выходить за границу max, то и не стоит давать читающему код повода так думать используя val < max в условии выхода из цикла. *Делает наивное лицо* А разве в Си не принято, что val вообще не существует при выходе из цикла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2016, 10:29 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
.NETОн и не будет так думать .NETОн будет думать Ты уж определись думает твой кролик или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2016, 10:40 |
|
||
|
while(val != max) или while(val < max)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПроцитируйте пожалуйста, если вас не сильно затруднит. Первый автор известный товарищ, только фамилия у него Koenig, если не ошибаюсь, а второго я не знаю. Да, фамилия первого автора Koenig, я ошибся. Another reason to count from 0 is that we have to option of using != as our comparison instead of <=. This distinction may seem trivial, but it affects what we know about the state of program then loop finished. For example, if the condition is r != rows , then when the loop finishes, we know that r == rows . Because the invariant says that we have written r rows of output, we know that we have written exactly rows rows all told. On the other hand, if the condition is r <= rows , then all we can prove is that we have written at least rows rows of output. For all we know, we might have written more. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2016, 12:32 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018595]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 277ms |
| total: | 449ms |

| 0 / 0 |
