Какая разница между i++
и ++i
?
Возьмем как пример строку:
for (i = ceil(a); i <= floor(b); i++)
cout << i << " ";
В связи с наступлением на нас шаблонов в С++, рекомендуется писать в циклах ++i а не i++. Это связано с тем, что прединкремент для классов обычно реализуется проще, чем постинкремент (как минимум, не надо хранить старое значение для возврата). Поэтому, если к примеру в шаблон в качестве типа счетчика цикла будет подставлено не просто целое, а сверхдлинное целое, то внутри циклов будет меньше ненужной работы.
Никакой.
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;
}
i++
сначала берёт значение переменной, а потом увеличивает переменную i
на 1
, а ++i
наоборот, сначала увеличивает значение переменной i
на 1
, а потом берёт значение i
.
i++
вычисляет i
, потом увеличивает.
++i
увеличивает i
, потом вычисляет.
В дополнение к другим ответам добавлю, что операции постинкремента и прединкремента имеют разные приоритеты. Постинкремент имеет выше приоритет чем преинкремент, поэтому код
int val = 1;
++val++; // Ошибка компиляции!
приведет к ошибке компиляции. Также код вроде
int val = 1;
val++++++; // Ошибка компиляции!
вызовет ошибку компиляции. Но код
int val = 1;
++++++val; // Все хорошо!
скомпилируется и выполнится без ошибок. Все вышесказанное также применимо к операциям декремента.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Работаю в Visual Studio 2008 C++Для проекта нужны две библиотеки chrono и thread
Подскажите, пожалуйста, возникает ли в следующем случае неопределенное поведение: