Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.93/120: Рейтинг темы: голосов - 120, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 26.08.2019
Сообщений: 2
1

значение i++ в цикле for

26.08.2019, 23:43. Показов 21933. Ответов 20
Метки i++ (Все метки)

кто может объяснить что делает i++ в цикле и как работать с i-- к примеру?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2019, 23:43
Ответы с готовыми решениями:

Как присвоить значение переменной если значение позже устанавливается в цикле?
Кратко: if($_SESSION != ""){ $row = mysql_num_rows(mysql_query("...")); if($row > 0) $panel...

Значение true в цикле while
Что из себя представляет это true в while??????Я понимаю, что пока условие верно в {}, но хотелось...

Теряется значение в цикле while
Добрый день! Проблема такова,при некоторых значениях переменной в цикле while теряются отсчеты см...

Необходимо увеличивать значение h в цикле
Как решить задачу? Необходимо увеличивать значение h в цикле class Program { static...

20
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
27.08.2019, 00:24 2
i++ - постфиксный икримент переменной. Инкремент - значит, что операция ++ увеличивает переменную на единицу. Постфиксный - значит, что сначала при, например, копировании этой переменной, будет запомнено текущее значение i, а уже затем i увеличивается на 1. Есть так же префиксная форма записи (++i) - сначала i увеличится, затем с ней можно будет проводить разного рода операции.
C++
1
2
3
4
5
6
int value = 0;
int copy;
 
copy = value++; //copy = 0, value = 1
 
copy = ++value //copy = 2, value = 2
i-- - постфиксный декремент. Логика такая же как и с инкрементом, только вместо прибавления единицы, эта единица вычитается.

В цикле for i, бывает, используется для прохождения массива, от первого элемента (с индексом 0) до последнего (с индексом size - 1)
C++
1
2
3
4
int nums[6] = {4, 8, 15, 16, 23, 42};
//так i примет все значения от 0 до 6, а в консоли мы увидим все числа массива
for(int i = 0; i < 6; i++)
  cout << nums[i] << ' ';
Грубо говоря, этот for можно разложить на более простой while так:
C++
1
2
3
4
5
6
7
int nums[6] = {4, 8, 15, 16, 23, 42};
int i = 0;
while(i < 6) {
  cout << nums[i] << ' ';
  i++;
}
//хоть i и принимает 7 значений (0, 1, 2, 3, 4, 5, 6), последнее (6) никак не используется в цикле, т.к., когда [INLINE]i = 6[/INLINE], условие [INLINE]i < 6[/INLINE] не выполняется.
1
0 / 0 / 0
Регистрация: 26.08.2019
Сообщений: 2
27.08.2019, 01:37  [ТС] 3
БЛАГОДАРЮ!!!!!!!
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.08.2019, 11:13 4
Цитата Сообщение от BeBornGod Посмотреть сообщение
и как работать с i-- к примеру?
Очень просто, например, так:
C++
1
2
3
4
int arr[n]{...};
for (std::size_t i = n; i--; ) {
    std::cout << arr[i];
}
1
Модератор
Эксперт С++
11045 / 9111 / 5473
Регистрация: 18.12.2011
Сообщений: 24,362
27.08.2019, 17:36 5
Цитата Сообщение от Cortas Посмотреть сообщение
разложить на более простой while так:
Чуть-чуть не так
C++
1
2
3
4
5
6
7
8
9
10
int nums[6] = {4, 8, 15, 16, 23, 42};
{
   int i = 0;
   while(i < 6) {
      cout << nums[i] << ' ';
      i++;
  }
}
// здесь переменная i уже не существует
...
0
217 / 171 / 96
Регистрация: 15.04.2018
Сообщений: 685
27.08.2019, 20:06 6
Azazel-San, надеюсь такой код вы пишите только для разминки мозгов автора темы
0
Нарушитель
1486 / 1288 / 485
Регистрация: 16.08.2014
Сообщений: 5,415
Записей в блоге: 1
27.08.2019, 20:34 7
Цитата Сообщение от mvngr Посмотреть сообщение
надеюсь такой код вы пишите только для разминки мозгов автора темы
а что не так с его кодом?
1
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.08.2019, 23:49 8
Цитата Сообщение от mvngr Посмотреть сообщение
Azazel-San, надеюсь такой код вы пишите только для разминки мозгов автора темы
Обычный код, на продакшене и не такое встретишь
0
488 / 285 / 128
Регистрация: 30.10.2018
Сообщений: 1,309
28.08.2019, 08:36 9
Цитата Сообщение от _stanislav Посмотреть сообщение
а что не так с его кодом?
если не смотреть на ошибку, то все впорядке.
0
217 / 171 / 96
Регистрация: 15.04.2018
Сообщений: 685
28.08.2019, 08:40 10
kitsoRik, ошибки там нет, он отрабатывает, просто очевидно, что на прочтение и понимание этой строчки я потрачу немыслимо больше времени, чем на стандартную for(int i = n - 1; i >= 0; i--), а прироста в скорости это никакого не даст.

Итого мы получим увеличенное время на осознание кода, при неизменной производительности
0
Нарушитель
1486 / 1288 / 485
Регистрация: 16.08.2014
Сообщений: 5,415
Записей в блоге: 1
28.08.2019, 08:46 11
Цитата Сообщение от mvngr Посмотреть сообщение
а прироста в скорости это никакого не даст
наверное это зависит от компилятора, как он оптимизирует этот цикл, но если отбросить оптимизацию и качество оптимизации, то я считаю так, меньше исходного кода меньше машинных команд. откуда кстати такая уверенность в том что прироста в скорости не будет?
0
217 / 171 / 96
Регистрация: 15.04.2018
Сообщений: 685
28.08.2019, 09:08 12
_stanislav, это очень просто проверить

Мой вариант:

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
    int m[3] {1,2,3};
    for(int i = 3; i >= 0; i--)
        std::cout << m[i] << std::endl;
 
    return 0;
}
Bash
1
gcc -S main.cpp
Получаем 104 строки ассемблер кода.

Теперь код

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
    int m[3] {1,2,3};
    for(int i = 3; i--; )
        std::cout << m[i] << std::endl;
 
    return 0;
}
Запускаем с тем же флагом - 107 строк кода

Так что по крайней мере фраза "меньше исходного кода меньше машинных команд" в данном случае не верна

К сожалению, меня не учили ассемблеру, так что сказать, какой там цикл лучше выглядит и быстрее не смогу

p.s. gcc version 6.3.0
0
488 / 285 / 128
Регистрация: 30.10.2018
Сообщений: 1,309
28.08.2019, 09:10 13
mvngr, конкретно в его коде ошибок нет, но для новичка, не будет понятно, почему цикл закончился, ведь все знают, как устроен for:
for(инициализация ; условия ; инкремент)
и как будет думать (к примеру) ТС, когда условия - это тот же инремент? Он же не поймет, что i достигнет ноля и выйдет из цикла.

Не по теме:

"Ошибка" - это я имел ввиду не в коде, а в ошибка в его сознании, ведь если человек спрашивает про элементарное "i--", то куда ему задавать такую сложную конструкцию в виде size_t и непонятного условия

0
217 / 171 / 96
Регистрация: 15.04.2018
Сообщений: 685
28.08.2019, 09:19 14
kitsoRik, я с вами согласен, поэтому и писал:

Цитата Сообщение от mvngr Посмотреть сообщение
надеюсь такой код вы пишите только для разминки мозгов автора темы
0
Нарушитель
1486 / 1288 / 485
Регистрация: 16.08.2014
Сообщений: 5,415
Записей в блоге: 1
28.08.2019, 09:28 15
Цитата Сообщение от mvngr Посмотреть сообщение
К сожалению, меня не учили ассемблеру, так что сказать, какой там цикл лучше выглядит и быстрее не смогу
ты утверждаешь что не можешь сказать какой цикл лучше выглядит, но тут же заявляешь что:
Цитата Сообщение от mvngr Посмотреть сообщение
Так что по крайней мере фраза "меньше исходного кода меньше машинных команд" в данном случае не верна
1
217 / 171 / 96
Регистрация: 15.04.2018
Сообщений: 685
28.08.2019, 09:32 16
_stanislav, вы точно не по диагонали читали моё сообщение?

> 104 строки ассемблер кода
> 107 строк кода

>Так что по крайней мере фраза "меньше исходного кода меньше машинных команд" в данном случае не верна
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
28.08.2019, 11:31 17
Цитата Сообщение от mvngr Посмотреть сообщение
что на прочтение и понимание этой строчки я потрачу немыслимо больше времени, чем на стандартную for(int i = n - 1; i >= 0; i--)
Почему больше? Там же все понятно.. Достаточно понимать как работают базовые вещи, типа цикла for.
Цитата Сообщение от mvngr Посмотреть сообщение
а прироста в скорости это никакого не даст
По сравнению с чем? Довольно громкие заявления, а пруфы будут?
Цитата Сообщение от mvngr Посмотреть сообщение
Итого мы получим увеличенное время на осознание кода, при неизменной производительности
Эм, что? Бредите?
Цитата Сообщение от mvngr Посмотреть сообщение
Запускаем с тем же флагом - 107 строк кода
Ахах, вы меряете производительность кол-вом выхлопа компилятора?
Цитата Сообщение от mvngr Посмотреть сообщение
Так что по крайней мере фраза "меньше исходного кода меньше машинных команд" в данном случае не верна
Это вообще ни на что не влияет, реально, в итоге вышло больше на две строчки))
Тем более, что ваша версия и моя идентичны, только моя компактнее. Компилятор в итоге сгенерирует почти одинаковый исходный код, именно для этого кусочка кода - https://godbolt.org/z/yEFpYt )
Если можно написать одно и тоже только компактнее и красивее, то сделайте это.
Цитата Сообщение от kitsoRik Посмотреть сообщение
но для новичка, не будет понятно, почему цикл закончился, ведь все знают, как устроен for
Похоже вы вот тоже не знаете)
Как сказал один очень хороший человек: "Надо всегда пытаться прыгать выше, иначе не будет никакого развития." (с)
Цитата Сообщение от mvngr Посмотреть сообщение
_stanislav, вы точно не по диагонали читали моё сообщение?
> 104 строки ассемблер кода
> 107 строк кода
>Так что по крайней мере фраза "меньше исходного кода меньше машинных команд" в данном случае не верна
Это вообще бред, вы как в той поговорке "Слышу звон да не знаю где он" )

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от _stanislav Посмотреть сообщение
ты утверждаешь что не можешь сказать какой цикл лучше выглядит, но тут же заявляешь что
Та забей :)

0
488 / 285 / 128
Регистрация: 30.10.2018
Сообщений: 1,309
28.08.2019, 11:36 18
Цитата Сообщение от Azazel-San Посмотреть сообщение
Похоже вы вот тоже не знаете)
Возможно. Ночью замученый будете читать такой код, сразу после таких строк кода, захочиться глаза себе выколоть, и тому кто это писал руки отрубить.
1
Нарушитель
1486 / 1288 / 485
Регистрация: 16.08.2014
Сообщений: 5,415
Записей в блоге: 1
28.08.2019, 11:40 19
Цитата Сообщение от kitsoRik Посмотреть сообщение
и тому кто это писал руки отрубить.
мне данный код кажется элегантным и по тому мне читать его как минимум так же, а может даже и легче. дело привычки это.
вот как это: while (*p++ = *q++);

Бьёрн пишет по данному коду:

Можно ли сказать, что этот код менее читаем, чем предыдущие версии? Только
не для опытных С и C++ программистов. А является ли он более эффективным? Не
обязательно (если, конечно, не рассматривать версию с вызовом функции strlen ()
для отдельного вычисления длины строки). Эффективность в сильной степени
будет зависеть от архитектуры компьютера и особенностей конкретного компилятора.
1
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
28.08.2019, 12:20 20
Цитата Сообщение от kitsoRik Посмотреть сообщение
Ночью замученый будете читать такой код, сразу после таких строк кода, захочиться глаза себе выколоть, и тому кто это писал руки отрубить.
Прохладная история..
Я бы отрубал лучше за незнание основ, имхо)

Добавлено через 1 минуту
Цитата Сообщение от _stanislav Посмотреть сообщение
Бьёрн пишет по данному коду:
Да все окей, стоит открыть любой продакшн проект на пару сотен тысяч строк кода, даже опен-соурсный, там везде будет такое (и даже хуже ) и это нормально. Да, даже не надо далеко идти можно открыть src STL'a)

Добавлено через 3 минуты
Цитата Сообщение от mvngr Посмотреть сообщение
for(int i = 3;
Не 3, а 2 тогда, ато выход за пределы массива)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2019, 12:20

Изменение значение указателя в цикле
Добрый день! У меня возникла проблема следущего характера: в цикле for (i=0;i&lt;(n*n);i++) у меня...

присвоить значение переменным в цикле
Подскажите, пожалуйста, каким образом можно присвоить значение по циклу. Допустим у меня из бд...

Присваивается пустое значение в цикле
Здравствуйте, подскажите пожалуйста, в чем мб ошибка. Есть текстовый файл, достаем оттуда...

Не меняется значение label в цикле
Код вроде такого private void button1_Click(object sender, RoutedEventArgs e) { for(int i;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.