Написание циклов с i ++ или ++ i [дубликаты]

0

У меня вопрос о написании петель. Я всегда начинаю с

(int i=0; i<10; i++)

Но я вижу, что многие эксперты начинают с

(int i=0; i<10; ++i)

Есть ли какая-то реальная разница, или они такие же?

Конечно, я знаю разницу между предварительным приращением и пост-приращением. Я имею в виду, какой из них я должен использовать при написании цикла? или это зависит.

Благодарю!

Теги:

4 ответа

5

Между ними нет разницы. Единственное отличие - предварительный прирост и приращение постов.

Разница между 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++ - нет.

  • 0
    Почему люди проголосовали за это ...?
  • 0
    Понятия не имею - это случалось со мной так часто.
Показать ещё 9 комментариев
2

В C++ есть разница. Пока префиксный оператор вернет ссылку на это значение, оператор postfix вернет копию и, следовательно, будет медленнее, чем оператор префикса.

  • 0
    Только если тип i определяется пользователем и его operator++ не является встроенным.
  • 0
    Для многих примитивных типов любой приличный компилятор оптимизирует это воспринимаемое снижение производительности. Для более сложных типов это может быть правдой.
1

Основное различие между pre- и последующим приращением лежит в возвращаемом значении.
Post-incrementing возвращает значение, которое присутствовало до того, как переменная была увеличена, по существу создавая копию старого значения. pre- incrementing возвращает ссылку на новое значение, тем самым избегая создания временной переменной.
Вообще говоря, это не имеет никакого значения и в основном зависит от вкуса, но в некоторых случаях, когда память коротка, опция pre- increment может оказаться более полезной. Я также читал, что версия с последующим инкрементом должна быть медленнее (поскольку она создает новую временную переменную), но я не нашел никакого убедительного доказательства того, что

0

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

Поскольку preincrement иногда быстрее (с не примитивными типами, такими как итераторы), это хорошая привычка проникать даже в тех случаях, когда это не влияет на производительность, поэтому многие рекомендуют это. Например, это пункт 28 в C++.

  • 0
    В этом случае какая семантическая разница?
  • 0
    В этом случае нет никакой разницы, но вопрос заключался в том, почему «многие эксперты» предпочитают преинкремент, и ответ заключается в том, что в некоторых случаях это имеет значение, и поэтому это хорошая привычка даже в тех случаях, когда это не так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню