Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > В for следует ли сравнивать оператором != или <?


Автор: zim22 7.7.2010, 16:58
День добрый.
Последнее время я пишу на C/Objective-C и уже подзабыл С++
Можете мне сказать, в чём преимущество != перед < ?

Я что-то смутно помню насчёт того, что != реализован для всех типов итераторов, а < только для определённых
И некоторые STL алгоритмы не работают с <, но работают с !=

Освежите пожалуйста мою память. 

Я хочу ввести такой стандарт кодирования:
Код

for (int i = 0; i != 5; ++i)


Но некоторые люди настаивают на <
Код

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

Автор: mes 7.7.2010, 17:03
Цитата(zim22 @  7.7.2010,  15:58 Найти цитируемый пост)
о != реализован для всех типов итераторов, а < только для определённых

 smile 

Автор: zim22 7.7.2010, 17:09
но т.к. в С/Objective-C нету итераторов, то аргумент в пользу != думаю будет звучать не очень убедительно.

тем более что защитники < аргументируют это тем, что в такой ситуации
Код

for (int i = 0; i < 5; i += 2)

оператор < отработает корректно, а != приведёт к вечному циклу.

неужели оператор != проиграл? а я так его любил smile

Автор: borisbn 7.7.2010, 17:41
Цитата(zim22 @  7.7.2010,  17:09 Найти цитируемый пост)
неужели оператор != проиграл? а я так его любил 

для простых типов ( int и т.п. ) лучше использовать <
1. начальное значение может быть не 0, а значение переменной
Код

for ( int i = start; i != 5; i++)

будет бесконечный цикл при start > 5

2. ну и твой пример с +=2

а для итераторов можно использовать только !=, т.к. в такой конструкции
Код

for ( T::iterator it = container.begin(); it < container.end(); ++it )

сам понимаешь, что будет

Автор: zim22 7.7.2010, 17:56
Цитата(borisbn @  7.7.2010,  16:41 Найти цитируемый пост)
а для итераторов можно использовать только !=, т.к. в такой конструкции
Код

for ( T::iterator it = container.begin(); it < container.end(); ++it )

 сам понимаешь, что будет

как по мне - там всё нормально будет. или я сам не понимаю? smile

Автор: bsa 7.7.2010, 18:06
Цитата(zim22 @  7.7.2010,  18:56 Найти цитируемый пост)
как по мне - там всё нормально будет.

Только если iterator является соответствует спецификации random_access_iterator. Если это просто итератор (list::iterator, map::iterator, set::iterator, istream_iterator), то цикл не скомпилируется.

Автор: Kurganec 7.7.2010, 21:13
немного не в тему, но...
 почему для итерраторов в цикле предпочительно использовать преинкрементацию?
 В книге Макса Шлее  написано, что "Это позволяет избежать при каждом витке цикла, сохранение старого значения". Или это относится только к Tulip ?
Или это дело привычки?

Автор: mes 7.7.2010, 21:33
Цитата(Kurganec @  7.7.2010,  20:13 Найти цитируемый пост)
Это позволяет избежать при каждом витке цикла, сохранение старого значения

 smile 
Цитата(Kurganec @  7.7.2010,  20:13 Найти цитируемый пост)
Или это дело привычки?

для простых типов да, по аналогии с итераторами.. 

и вообще по этому вопросу в поиск.. тема поднимается регулярно.. 

Автор: maxim1000 7.7.2010, 23:49
Если не ошибаюсь, Страуструп писал, что один из очень плохих способов вводить стандарты кодирования для C++ - просто дополнять уже имеющиеся стандарты для C.

Про Objective-C знаю немного, но насколько я понимаю, отличается от C++ он очень сильно. Стоит ли при разработке стандартов для него думать о C++?

Автор: zim22 8.7.2010, 10:10
Цитата(maxim1000 @  7.7.2010,  22:49 Найти цитируемый пост)
Стоит ли при разработке стандартов для него думать о C++?

для Objective-C думать не стоит о С++. но у нас смешанный код. С/С++/Objective-C/Objective-C++

Автор: azesmcar 8.7.2010, 10:40
zim22

Я не думаю, что это тема для стандарта кодирования. Все эти стандарты только мешают работать, я в стандарты вводил только правила оформления кода, остальное проверялось на этапе code review.

Автор: zim22 8.7.2010, 15:44
azesmcar, code review - это следующее, что я собираюсь ввести smile

Автор: azesmcar 8.7.2010, 16:45
Цитата(zim22 @  8.7.2010,  15:44 Найти цитируемый пост)
azesmcar, code review - это следующее, что я собираюсь ввести smile

Это на мой взгляд намного полезнее всяких стандартов. smile 

Автор: bsa 12.7.2010, 12:57
Цитата(Kurganec @  7.7.2010,  22:13 Найти цитируемый пост)
почему для итерраторов в цикле предпочительно использовать преинкрементацию?
 В книге Макса Шлее  написано, что "Это позволяет избежать при каждом витке цикла, сохранение старого значения". Или это относится только к Tulip ?
Или это дело привычки?
В http://forum.vingrad.ru/forum/topic-269794/kw-faq-c++.html заглядывать пробовал?

Автор: chaos 12.7.2010, 14:52
офтоп:
Цитата(zim22 @  8.7.2010,  07:10 Найти цитируемый пост)
С/С++/Objective-C/Objective-C++

а можно в кратце про проект: 
1. для чего вам понадобился такой зоопарк языков? 
2. следствеи п.1 это какое-то кросс приложение - есть какая-то общая часть кодна на С++, а все остальное ....
3. Ведь Objective-C == C(но не на оборот), тогда Вы может запутались и используете только Objective-C++ ?

Автор: baldina 12.7.2010, 16:42
zim22, что касается преимуществ != перед < то помимо типов итераторов есть еще одно, упомянутое впервые, кажется, Дейкстрой: != более жесткое условие, и зависание (падение) программы произойдет в тех случаях, когда < пропустит ошибку. т.е. ошибка будет обнаружена раньше.
Код

for (int i = 0; i < 5; i += 2)

это как раз показывает, что к стандартам кодирования тема не относится. есть разные случаи smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)