Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39182806&tid=2018595]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 166ms |

| 0 / 0 |
