Какая разница между i++ и ++i?

173
16 декабря 2021, 05:10

Какая разница между i++ и ++i?

Возьмем как пример строку:

for (i = ceil(a); i <= floor(b); i++)
cout << i << " ";
Answer 1

В связи с наступлением на нас шаблонов в С++, рекомендуется писать в циклах ++i а не i++. Это связано с тем, что прединкремент для классов обычно реализуется проще, чем постинкремент (как минимум, не надо хранить старое значение для возврата). Поэтому, если к примеру в шаблон в качестве типа счетчика цикла будет подставлено не просто целое, а сверхдлинное целое, то внутри циклов будет меньше ненужной работы.

Answer 2

Никакой.

for (i = ceil(a); i <= floor(b); i++)

Здесь нужно просто увеличить значение переменной на единицу.

А так (когда значение переменной возвращаемое оператором используется) - разница есть:

var i = 1; 
var j = 1; 
console.log(i++, ++j); 
console.log(i, j);

Причем именно такая, какая описана в определении этих операторов.

C++ код для данного примера:

int main()
{
  int i = 1, j = 1;
  cout << i++ << ", " << ++j << endl;
  cout << i   << ", " << j   << endl;
}
Answer 3

i++ сначала берёт значение переменной, а потом увеличивает переменную i на 1, а ++i наоборот, сначала увеличивает значение переменной i на 1, а потом берёт значение i.

Answer 4

i++ вычисляет i, потом увеличивает. ++i увеличивает i, потом вычисляет.

Answer 5

В дополнение к другим ответам добавлю, что операции постинкремента и прединкремента имеют разные приоритеты. Постинкремент имеет выше приоритет чем преинкремент, поэтому код

int val = 1;
++val++;      // Ошибка компиляции!

приведет к ошибке компиляции. Также код вроде

int val = 1;
val++++++;    // Ошибка компиляции!

вызовет ошибку компиляции. Но код

int val = 1;
++++++val;    // Все хорошо!

скомпилируется и выполнится без ошибок. Все вышесказанное также применимо к операциям декремента.

READ ALSO
Visual C++ 2008. Не удается открыть файл include: chrono / thread

Visual C++ 2008. Не удается открыть файл include: chrono / thread

Работаю в Visual Studio 2008 C++Для проекта нужны две библиотеки chrono и thread

156
C++, возникнет ли неопределенное поведение в следующем случае

C++, возникнет ли неопределенное поведение в следующем случае

Подскажите, пожалуйста, возникает ли в следующем случае неопределенное поведение:

103