Разница между i ++ и ++ i в цикле? - PullRequest
277 голосов
/ 27 января 2009

Есть ли разница в ++i и i++ в цикле for? Это просто синтаксис?

Ответы [ 21 ]

4 голосов
/ 27 января 2009

Нет фактической разницы в обоих случаях i будет увеличено на 1.

Но есть разница, когда вы используете его в выражении, например:

int i = 1;
int a = ++i;
// i is incremented by one and then assigned to a.
// Both i and a are now 2.
int b = i++;
// i is assigned to b and then incremented by one.
// b is now 2, and i is now 3
3 голосов
/ 27 января 2009

В JavaScript из-за следующих i ++ может быть лучше использовать:

var i=1;
alert(i++); // before, 1. current, 1. after, 2.
alert(i); // before, 2. current, 2. after, 2.
alert(++i); // before, 2. current, 3 after, 3.

В то время как массивы (я думаю, что все) и некоторые другие функции и вызовы используют 0 в качестве отправной точки, вы должны установить для i значение -1, чтобы цикл работал с массивом при использовании ++ i,

При использовании i ++ следующее значение будет использовать увеличенное значение. Вы можете сказать, что i ++ - это способ подсчета людей, потому что вы можете начать с 0 .

3 голосов
/ 27 января 2009

В ++ i и i ++ есть больше, чем циклы и различия в производительности. ++ i возвращает l-значение, а i ++ возвращает r-значение. Исходя из этого, есть много вещей, которые вы можете сделать с (++ i), но не с (i ++).

1- It is illegal to take the address of post increment result. Compiler won't even allow you.
2- Only constant references to post increment can exist, i.e., of the form const T&.
3- You cannot apply another post increment or decrement to the result of i++, i.e., there is no such thing as I++++. This would be parsed as ( i ++ ) ++ which is illegal.
4- When overloading pre-/post-increment and decrement operators, programmers are encouraged to define post- increment/decrement operators like:

T& operator ++ ( )
{
   // logical increment
   return *this;
}

const T operator ++ ( int )
{
    T temp( *this );
    ++*this;
    return temp;
}
3 голосов
/ 17 октября 2016

Мне непонятно, почему люди могут записывать выражение приращения в цикле for как i ++.

В цикле for, когда 3-й компонент является простым оператором приращения, как в

for (i=0; i<x; i++)  

или

for (i=0; i<x; ++i)   

нет никакой разницы в итоговых казнях.

2 голосов
/ 27 января 2009

Как говорит @ Jon B , в цикле for нет разницы.

Но в цикле while или do...while вы можете найти некоторые различия, если сравниваете с ++i или i++

while(i++ < 10) { ... } //compare then increment

while(++i < 10) { ... } //increment then compare
1 голос
/ 22 ноября 2014

Они оба увеличивают число. ++i эквивалентно i = i + 1.

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

int i = 3;
int a = i++; // a = 3, i = 4
int b = ++a; // b = 4, a = 

Проверьте эту ссылку .

1 голос
/ 11 марта 2017

Да, есть разница между ++i и i++ в цикле for, хотя в необычных случаях использования; когда переменная цикла с оператором увеличения / уменьшения используется в блоке for или в выражении теста цикла или с одной из переменных цикла . Нет, это не просто синтаксис.

Поскольку i в коде означает оценку выражения i, а оператор означает не оценку, а просто операцию;

  • ++i означает значение приращения i на 1 и последующие оценки i,
  • i++ означает оценку i и последующее значение приращения i на 1.

Итак, то, что получается из каждых двух выражений, отличается, потому что то, что оценивается, отличается в каждом. Все то же самое для --i и i--

Например;

let i = 0

i++ // evaluates to value of i, means evaluates to 0, later increments i by 1, i is now 1
0
i
1
++i // increments i by 1, i is now 2, later evaluates to value of i, means evaluates to 2
2
i
2

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

for(i=0, j=i; i<10; j=++i){
    console.log(j, i)
}

for(i=0, j=i; i<10; j=i++){
    console.log(j, i)
}
1 голос
/ 27 января 2009

Там может быть разница для петель. Это практическое применение post / pre-increment.

        int i = 0;
        while(i++ <= 10) {
            Console.Write(i);
        }
        Console.Write(System.Environment.NewLine);

        i = 0;
        while(++i <= 10) {
            Console.Write(i);
        }
        Console.ReadLine();

В то время как первый считается до 11 и повторяется 11 раз, второй - нет.

Чаще всего это используется в простом while (x--> 0); - - Цикл для итерации, например, всех элементов массива (здесь исключаются конструкции foreach).

0 голосов
/ 27 января 2009

Для i пользовательских типов эти операторы могут (но не должно ) иметь значимо различную семантику в контексте индекса цикла, и это может (но не должно) влиять поведение цикла описано.

Кроме того, в c++ обычно безопаснее использовать форму предварительного увеличения (++i), поскольку ее легче оптимизировать. (Скотт Лэнгхэм побил меня до этого лакомого кусочка . Проклинаю тебя, Скотт)

0 голосов
/ 30 ноября 2016

i ++; ++ я; оба схожи, поскольку они не используются в выражении.

class A {

     public static void main (String []args) {

     int j = 0 ;
     int k = 0 ;
     ++j;
     k++;
    System.out.println(k+" "+j);

}}

prints out :  1 1
...