I что означает c
еще тут не написано, что по возможности стоит использовать ++i, а не i++.
в первом случае значение i увеличивается и возвращается тот же объект i.
во втором случае создается вспомогательный объект-копия i, увеличивается значение i, а возвращается копия.
поэтому второй работает медленнее.
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке — https://slurm.club/3MeqNEk
C: В чем разница между ++ i и i ++?
В C, в чем разница между использованием ++i и i++ , и что следует использовать в блоке приращения for цикла?
++i будет увеличивать значение i , а затем возвращать увеличенное значение.
i++ будет увеличивать значение i , но возвращать исходное значение, которое i удерживалось до увеличения.
Для for цикла либо работает. ++i кажется более распространенным, может быть , потому что это то , что используется в K & R .
В любом случае, следуйте указаниям «предпочитайте ++i более i++ », и вы не ошибетесь.
Есть пара комментариев относительно эффективности ++i и i++ . В любом компиляторе не для студенческого проекта разницы в производительности не будет. Вы можете убедиться в этом, посмотрев на сгенерированный код, который будет идентичен.
Вопрос эффективности интересен . вот моя попытка ответить: есть ли разница в производительности между i ++ и ++ i в C?
Как отмечает @OnFreund , он отличается для объекта C ++, поскольку operator++() это функция, и компилятор не может знать, как оптимизировать создание временного объекта для хранения промежуточного значения.
i ++ известен как Post Increment, тогда как ++ i называется Pre Increment.
i++
i++ это постинкремент, потому что он увеличивает i значение на 1 после завершения операции.
Давайте посмотрим на следующий пример:
Здесь ценность j = 1 но i = 2 . Здесь значение i будет присвоено j первому, а затем i будет увеличено.
++i
++i является предварительным приращением, потому что оно увеличивает i значение на 1 перед операцией. Значит j = i; выполнится после i++ .
Давайте посмотрим на следующий пример:
Здесь ценность j = 2 но i = 2 . Здесь значение i будет присвоено j после i увеличения i . Аналогично ++i будет выполнен раньше j=i; .
На ваш вопрос, который следует использовать в блоке инкремента цикла for? Ответ в том, что вы можете использовать любой . не имеет значения. Он выполнит ваш цикл for же нет. раз.
Оба цикла будут давать одинаковый результат. то есть 0 1 2 3 4 .
Это имеет значение только там, где вы его используете.
В этом случае вывод будет 1 2 3 4 5 .
Пожалуйста, не беспокойтесь о «эффективности» (скорости, действительно) которой быстрее. В наши дни у нас есть компиляторы, которые заботятся об этих вещах. Используйте тот, который имеет смысл использовать, исходя из того, что более четко показывает ваши намерения.
++i увеличивает значение, затем возвращает его.
i++ возвращает значение, а затем увеличивает его.
Это тонкая разница.
Для цикла for используйте ++i , так как он немного быстрее. i++ создаст дополнительную копию, которую просто выбрасывают.
i++ : В этом сценарии сначала присваивается значение, а затем происходит приращение.
++i : В этом сценарии сначала выполняется приращение, а затем присваивается значение
Ниже приведена визуализация изображения, а также хорошее практическое видео, демонстрирующее то же самое.

Причина ++i может быть немного быстрее, чем в i++ том, что i++ может потребоваться локальная копия значения i, прежде чем оно будет увеличено, хотя ++i никогда этого не происходит. В некоторых случаях некоторые компиляторы будут оптимизировать его, если это возможно . но это не всегда возможно, и не все компиляторы делают это.
Я стараюсь не слишком полагаться на оптимизацию компиляторов, поэтому следую совету Райана Фокса: когда я могу использовать оба, я использую ++i .
Эффективный результат использования любого в цикле идентичен. Другими словами, цикл будет делать одинаковую вещь в обоих случаях.
С точки зрения эффективности, выбор i ++ вместо ++ i может быть наказан. С точки зрения спецификации языка, использование оператора постинкремента должно создать дополнительную копию значения, на которое действует оператор. Это может быть источником дополнительных операций.
Тем не менее, вы должны рассмотреть две основные проблемы с предыдущей логикой.
Современные компиляторы великолепны. Все хорошие компиляторы достаточно умны, чтобы понимать, что в цикле for происходит целочисленный прирост, и он оптимизирует оба метода до одного и того же эффективного кода. Если использование постинкремента по сравнению с преинкрементом фактически приводит к замедлению работы вашей программы, то вы используете ужасный компилятор.
С точки зрения сложности во времени, эти два метода (даже если копия фактически выполняется) эквивалентны. Количество инструкций, выполняемых внутри цикла, должно значительно влиять на количество операций в операции приращения. Следовательно, в любом цикле значительного размера штраф за метод приращения будет значительно перекрыт выполнением тела цикла. Другими словами, вам лучше беспокоиться об оптимизации кода в цикле, а не о приращении.
На мой взгляд, весь вопрос просто сводится к стилевым предпочтениям. Если вы думаете, что предварительное увеличение более читабельно, используйте его. Лично я предпочитаю постинкремент, но это, вероятно, потому, что это было то, чему меня учили, прежде чем я что-то знал об оптимизации.
Это типичный пример преждевременной оптимизации, и подобные проблемы могут отвлечь нас от серьезных проблем в дизайне. Однако это все еще хороший вопрос, потому что в «наилучшей практике» нет единообразия в использовании или консенсусе.
В чём различие между i++ и i+1, когда речь идёт в о массивах?
Почему в цикле, когда я меняю if (p[i] < p[i+1]) на if (p[i] < p[i++]) программа перестаёт работать корректно?

- Вопрос задан более трёх лет назад
- 3582 просмотра
- Вконтакте

- Вконтакте






А давайте я укажу на все ошибки в вашей программе?
1) for(int i = 1 . )
Самое бросающееся в глаза. Индексация массивов начинается с нуля. Соответственно, условие в цикле должно быть
for(int i = 0; i < N; ++i)
(И не придется заводить массив на N+1 элементов)
2) exit(0)
Любая ваша проверка сразу же приведет к завершению программы. Поэтому ваша программа изначально работает некорректно — происходит сравнение только двух первых элементов
3) пресловутый i++
Рассмотрим полную команду
if (p[i] < p[i++])
По приоритетам, первой выполнится «i++», после чего значение i увеличится на единицу, в результате чего итоговое сравнение будет эквивалентно
i += 1;
if (p[i] < p[i]) .
Более того, даже если не учитывать неправильное сравнение и выход в первой же проверке, за один цикл for значение i оказывается увеличенным дважды (i++ в конце цикла и i++ в условии), что тоже далеко не нормально.
4) мелочи вроде
-printf(\n);
вместо того, чтобы дописать \n в конец прошлого текста
-использование short, когда эффективнее использовать int
В общем, тренируйтесь, познавайте принцип работы команд, совершенствуйте знание языка и впредь старайтесь избегать подобных ошибок 🙂