Чем отличается 1 от 1 в си
Перейти к содержимому

Чем отличается 1 от 1 в си

  • автор:

Какая разница в цикле for между «i ++» и «++ i»?

Я знаю какая разница между «i ++» и «++ i»
Но какая разница что в for будет i ++ или ++ i, это не меняет никакого значения, так почему тогда некоторые программисты в одном цикле пишут i ++, а в другом ++ i?

Буду очень рад если получу ответ на этот вопрос 🙂
Спасибо заранее.

  • Вопрос задан более трёх лет назад
  • 6292 просмотра

Комментировать
Решения вопроса 0
Ответы на вопрос 5

В данном случае присваивания не делается, поэтому никакой разницы в смысле результата работы нет.
Есть разница в смысле скорости (++i работает немного быстрее), но она настолько микроскопическая, что на неё нужно смело забивать в 99.(9)% случаев. Возможно даже, что сейчас компиляторы ловят эту ситуацию и тогда разница исчезает вовсе.
Сам я пишу ++i, но не ради перфоманса, это просто моя исторически сложившаяся вкусовщина.
Нужно просто выбрать один кодстайл (личный или корпоративный) и придерживаться его. Смешивать два варианта в пределах одной программы — это плохо.

Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать

SerafimArts

Кирилл Несмеянов @SerafimArts
Senior Notepad Reader

Как уже верно было сказано — в алгоритме отличий нет. Отличия лишь в выходном коде которые могут гененрировать компиляторы. Могут, просто потому, что эта инструкция допускает оптимизации во время компиляции. Так что всё зависит от самого компилятора.

Ещё с универа помню, объясняли, что на уровне ассемблера ++i превращается в одну инструкцию инкремента, i++ же в две (или одну, но не инкремемента, а обычного add), отсюда и отличия в производительности. P.S. Эта информация не точная и могу наврать, но в целом как-то так.

Операторы равенства: == и !=

Бинарные операторы равенства сравнивают операнды для строгого равенства или неравенства.

Операторы равенства, то есть равно ( == ) и не равно ( != ), имеют более низкий приоритет, чем операторы отношения, но их поведение аналогично. Тип результата для этих операторов . bool

== Оператор равного () возвращает true , если оба операнда имеют одно и то же значение; в противном случае возвращается false . Оператор not-equal-to ( != ) возвращает true , если операнды не имеют того же значения; в противном случае возвращается false .

Оператор ключевое слово для !=

C++ указывает not_eq в качестве альтернативной орфографии для != . (Нет альтернативной орфографии для == .) В C альтернативная орфография предоставляется в виде макроса в заголовке . В C++альтернативная орфография является ключевое слово; или эквивалентное не рекомендуется. В Microsoft C++ /permissive- параметр или /Za компилятор требуется для включения альтернативной орфографии.

Пример

// expre_Equality_Operators.cpp // compile with: /EHsc #include using namespace std; int main()

Операторы равенства могут сравнивать указатели на члены одного типа. В таком сравнении выполняются преобразования указателя на члены. Указатели на члены также можно сравнить с константным выражением, результатом которого является значение 0.

Чем отличается i++ от ++i

Часто начинающий программист запутывается в этих i++ и ++i. В этом небольшом посте попробуем разжевать материал так, чтобы не осталось сомнений в том, что Вы, молодой человек, никогда не запутаетесь и однозначно правильно решите какой вариант нужно использовать в конкретном случае. Пожалуй начать нужно с определения. Оператор ++ — это сокращенное представление инкремента. Другими словами этот оператор применяют для того, чтобы к переменной прибавить 1.

i = 0; i++; // то же самое что и i=i+1 ++i; // то же самое что и i=i+1

Но почему же, и главное в каких случаях i++ != ++i ? Дело в том что операция инкремента, как и другие операции, возвращает результат той самой операции. Важно какой результат! Разобравшись в этом больше вопросов не возникнет.

Операция инкремента I++

Данная операция возвращает значение I до того как к I прибавится 1.

int i = 0; int j = i++; // j == 0; // i == 1;

Операция инкремента ++I Данная операция возвращает I после выполнения операции сложения I+1

int i = 0; int j = ++i; // j = 1; // i = 1; // j = i;

По сути можно эту функцию разложить на другую: чуть подлиннее:

int i = 0; i++; // или ++i; int j = i; // j = 1; // i = 1; // j = i;

Надеюсь здесь всё понятно. Теперь, для закрепления материала приведу несколько примеров.

Пример 1: цикл while

int i = 0; cout 

Как мы видим в первом случае выводится значение i после выполнения операции сложения, а во втором случае: до.

Пример 2: цикл for

for (i = 0; i < 10; i++) cout 

В данном случае, по сути, ничего не меняется. Т.е. не зависимо от того, применяете Вы ++i или i++, в теле цикла мы получаем i = i+1. Поэтому над этим вообще не стоит ломать голову. Всё зависит то предпочтений программиста и никак не влияет на ход выполнения программы. А вот следующий пример идентичен примеру 1 с циклом while:

for (i = 0; i < 10;)< cout cout cout 

Подводим итоги:

Операция инкремента весьма часто используется во всех языках программирования. И то, что я приводил примеры на языке C++, по сути не меняет абсолютно ничего. В течении всей своей карьеры программиста вы ни раз примените эти знания на практике. Поэтому я очень надеюсь, что у меня получилось, всё таки, развернуто объяснить разницу между инкрементными операциями i++ и ++i. И в итоге я выкладываю простой пример на с++, объединивший в себе все выше приведенные примеры. Код программы доступен для скачивания с моего сайта.

В чём различие между i++ и i+1, когда речь идёт в о массивах?


b2dbbcfc91884565aa38fa5f76b51dab.jpg 1af4ad8c28d04c2c9d60d12e077b1dac.jpg

i+1 - возвращает значение i+1.
i++ - увеличивает значение i на 1, возвращает значение i до увеличения.
++i - увеличивает значение i на 1, возвращает новое значение i.

Ответ написан более трёх лет назад Нравится 7 5 комментариев

dmitry_dev33

dmitry_dev33 @dmitry_dev33 Автор вопроса согласен, тогда почему ++i тоже не работает?

Rsa97

dmitry_dev33: Потому что и преинкремент и постинкремент меняют значение переменной.

dmitry_dev33

dmitry_dev33 @dmitry_dev33 Автор вопроса Rsa97: понял, спасибо :)

dmitry_dev33

dmitry_dev33 @dmitry_dev33 Автор вопроса

Rsa97: Хотя, если cделать инкремент префиксным, подставить элементам массива значения 1,2,3,4,5 , то по идее должно работать, ибо новое значение переменной i, полученное в результате операции ++i совпадает с новым значением переменной i, стоящей в цикле

Rsa97

dmitry_dev33: Нет. Первый раз переменная изменится при выборке элемента массива, второй - при её увеличении в цикле. В результате будет выполняться с шагом 2.

15432

Системный программист ^_^

А давайте я укажу на все ошибки в вашей программе?

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

В общем, тренируйтесь, познавайте принцип работы команд, совершенствуйте знание языка и впредь старайтесь избегать подобных ошибок :)

как можно быстро исправить эту программу:

int main() < setlocale(LC_ALL, "RUSSIAN"); int i; int p[N]; for (i = 0; i < N; ++i) //вводим все числа < printf("\n Введите элемент массива p[i] = "); scanf_s("%d", &p[i]); >for (i = 0; i < N; ++i) //печатаем, что ввели - для проверки printf("%5d ", p[i]); for (i = 0; i < N - 1; ++i) //проходимся по всем числам до предпоследнего < //потому что последнее не с чем сравнивать, за ним дальше чисел нет if (p[i] >= p[i+1]) //проверяем только случай, когда условие возрастания не выполняется < printf("\n Элементы массива - НЕ возрастающая последовательность\n"); exit(0); //сразу же выходим из программы, т.к. определили невозрастание >//иначе продолжаем сравнивать элементы! > //мы до сих пор не вышли из программы, значит, последовательность всё же возрастающая printf("\n Элементы массива - возрастающая последовательность"); >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *