У меня вопрос о написании петель. Я всегда начинаю с
(int i=0; i<10; i++)
Но я вижу, что многие эксперты начинают с
(int i=0; i<10; ++i)
Есть ли какая-то реальная разница, или они такие же?
Конечно, я знаю разницу между предварительным приращением и пост-приращением. Я имею в виду, какой из них я должен использовать при написании цикла? или это зависит.
Благодарю!
Между ними нет разницы. Единственное отличие - предварительный прирост и приращение постов.
Разница между i++
и ++i
является значением выражения.
Значение i++
- значение i
перед приращением. Значение ++i
- значение i
после приращения.
Однако в вашей петле это не имеет никакого значения.
int i = 0;
00000088 xor edx,edx
0000008a mov dword ptr [ebp-40h],edx
i++;
0000008d inc dword ptr [ebp-40h]
++i;
00000090 inc dword ptr [ebp-40h]
Как вы можете видеть, это не влияет на производительность, но в определенных ситуациях вам может потребоваться увеличить число сразу после точки последовательности или до нее.
В C++ ++i
- значение l, но i++
- нет.
В C++ есть разница. Пока префиксный оператор вернет ссылку на это значение, оператор postfix вернет копию и, следовательно, будет медленнее, чем оператор префикса.
i
определяется пользователем и его operator++
не является встроенным.
Основное различие между pre- и последующим приращением лежит в возвращаемом значении.
Post-incrementing возвращает значение, которое присутствовало до того, как переменная была увеличена, по существу создавая копию старого значения. pre- incrementing возвращает ссылку на новое значение, тем самым избегая создания временной переменной.
Вообще говоря, это не имеет никакого значения и в основном зависит от вкуса, но в некоторых случаях, когда память коротка, опция pre- increment может оказаться более полезной. Я также читал, что версия с последующим инкрементом должна быть медленнее (поскольку она создает новую временную переменную), но я не нашел никакого убедительного доказательства того, что
Предпочтение обычно предпочтительнее, потому что, хотя для примитивных типов не имеет значения, оно может быть быстрее для итераторов, поскольку преинкремент не должен возвращать копию его старого значения.
Поскольку preincrement иногда быстрее (с не примитивными типами, такими как итераторы), это хорошая привычка проникать даже в тех случаях, когда это не влияет на производительность, поэтому многие рекомендуют это. Например, это пункт 28 в C++.