C: What is the difference between ++i and i++?

前端 未结 21 1942
伪装坚强ぢ
伪装坚强ぢ 2020-11-21 06:04

In C, what is the difference between using ++i and i++, and which should be used in the incrementation block of a for loop?

相关标签:
21条回答
  • 2020-11-21 06:20

    The effective result of using either in a loop is identical. In other words, the loop will do the same exact thing in both instances.

    In terms of efficiency, there could be a penalty involved with choosing i++ over ++i. In terms of the language spec, using the post-increment operator should create an extra copy of the value on which the operator is acting. This could be a source of extra operations.

    However, you should consider two main problems with the preceding logic.

    1. Modern compilers are great. All good compilers are smart enough to realize that it is seeing an integer increment in a for-loop, and it will optimize both methods to the same efficient code. If using post-increment over pre-increment actually causes your program to have a slower running time, then you are using a terrible compiler.

    2. In terms of operational time-complexity, the two methods (even if a copy is actually being performed) are equivalent. The number of instructions being performed inside of the loop should dominate the number of operations in the increment operation significantly. Therefore, in any loop of significant size, the penalty of the increment method will be massively overshadowed by the execution of the loop body. In other words, you are much better off worrying about optimizing the code in the loop rather than the increment.

    In my opinion, the whole issue simply boils down to a style preference. If you think pre-increment is more readable, then use it. Personally, I prefer the post-incrment, but that is probably because it was what I was taught before I knew anything about optimization.

    This is a quintessential example of premature optimization, and issues like this have the potential to distract us from serious issues in design. It is still a good question to ask, however, because there is no uniformity in usage or consensus in "best practice."

    0 讨论(0)
  • 2020-11-21 06:20

    Pre-crement means increment on the same line. Post-increment means increment after the line executes.

    int j=0;
    System.out.println(j); //0
    System.out.println(j++); //0. post-increment. It means after this line executes j increments.
    
    int k=0;
    System.out.println(k); //0
    System.out.println(++k); //1. pre increment. It means it increments first and then the line executes
    

    When it comes with OR, AND operators, it becomes more interesting.

    int m=0;
    if((m == 0 || m++ == 0) && (m++ == 1)) { //false
    /* in OR condition if first line is already true then compiler doesn't check the rest. It is technique of compiler optimization */
    System.out.println("post-increment "+m);
    }
    
    int n=0;
    if((n == 0 || n++ == 0) && (++n == 1)) { //true
    System.out.println("pre-increment "+n); //1
    }
    

    In Array

    System.out.println("In Array");
    int[] a = { 55, 11, 15, 20, 25 } ;
    int ii, jj, kk = 1, mm;
    ii = ++a[1]; // ii = 12. a[1] = a[1] + 1
    System.out.println(a[1]); //12
    
    jj = a[1]++; //12
    System.out.println(a[1]); //a[1] = 13
    
    mm = a[1];//13
    System.out.printf ( "\n%d %d %d\n", ii, jj, mm ) ; //12, 12, 13
    
    for (int val: a) {
         System.out.print(" " +val); //55, 13, 15, 20, 25
    }
    

    In C++ post/pre-increment of pointer variable

    #include <iostream>
    using namespace std;
    
    int main() {
    
        int x=10;
        int* p = &x;
    
        std::cout<<"address = "<<p<<"\n"; //prints address of x
        std::cout<<"address = "<<p<<"\n"; //prints (address of x) + sizeof(int)
        std::cout<<"address = "<<&x<<"\n"; //prints address of x
    
        std::cout<<"address = "<<++&x<<"\n"; //error. reference can't re-assign because it is fixed (immutable)
    }
    
    0 讨论(0)
  • 2020-11-21 06:21

    The only difference is the order of operations between the increment of the variable and the value the operator returns.

    This code and its output explains the the difference:

    #include<stdio.h>
    
    int main(int argc, char* argv[])
    {
      unsigned int i=0, a;
      printf("i initial value: %d; ", i);
      a = i++;
      printf("value returned by i++: %d, i after: %d\n", a, i);
      i=0;
      printf("i initial value: %d; ", i);
      a = ++i;
      printf(" value returned by ++i: %d, i after: %d\n",a, i);
    }
    

    The output is:

    i initial value: 0; value returned by i++: 0, i after: 1
    i initial value: 0;  value returned by ++i: 1, i after: 1
    

    So basically ++i returns the value after it is incremented, while i++ return the value before it is incremented. At the end, in both cases the i will have its value incremented.

    Another example:

    #include<stdio.h>
    
    int main ()
      int i=0;
      int a = i++*2;
      printf("i=0, i++*2=%d\n", a);
      i=0;
      a = ++i * 2;
      printf("i=0, ++i*2=%d\n", a);
      i=0;
      a = (++i) * 2;
      printf("i=0, (++i)*2=%d\n", a);
      i=0;
      a = (++i) * 2;
      printf("i=0, (++i)*2=%d\n", a);
      return 0;
    }
    

    Output:

    i=0, i++*2=0
    i=0, ++i*2=2
    i=0, (++i)*2=2
    i=0, (++i)*2=2
    

    Many times there is no difference

    Differences are clear when the returned value is assigned to another variable or when the increment is performed in concatenation with other operations where operations precedence is applied (i++*2 is different from ++i*2, but (i++)*2 and (++i)*2 returns the same value) in many cases they are interchangeable. A classical example is the for loop syntax:

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

    has the same effect of

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

    Rule to remember

    To not make any confusion between the two operators I adopted this rule:

    Associate the position of the operator ++ with respect to the variable i to the order of the ++ operation with respect to the assignment

    Said in other words:

    • ++ before i means incrementation must be carried out before assignment;
    • ++ after i means incrementation must be carried out after assignment:
    0 讨论(0)
  • 2020-11-21 06:25

    The difference can be understood by this simple C++ code below:

    int i, j, k, l;
    i = 1; //initialize int i with 1
    j = i+1; //add 1 with i and set that as the value of j. i is still 1
    k = i++; //k gets the current value of i, after that i is incremented. So here i is 2, but k is 1
    l = ++i; // i is incremented first and then returned. So the value of i is 3 and so does l.
    cout << i << ' ' << j << ' ' << k << ' '<< l << endl;
    return 0;
    
    0 讨论(0)
  • 2020-11-21 06:28

    I assume you understand the difference in semantics now (though honestly I wonder why people ask 'what does operator X mean' questions on stack overflow rather than reading, you know, a book or web tutorial or something.

    But anyway, as far as which one to use, ignore questions of performance, which are unlikely important even in C++. This is the principle you should use when deciding which to use:

    Say what you mean in code.

    If you don't need the value-before-increment in your statement, don't use that form of the operator. It's a minor issue, but unless you are working with a style guide that bans one version in favor of the other altogether (aka a bone-headed style guide), you should use the form that most exactly expresses what you are trying to do.

    QED, use the pre-increment version:

    for (int i = 0; i != X; ++i) ...
    
    0 讨论(0)
  • 2020-11-21 06:29

    The reason ++i can be slightly faster than i++ is that i++ can require a local copy of the value of i before it gets incremented, while ++i never does. In some cases, some compilers will optimize it away if possible... but it's not always possible, and not all compilers do this.

    I try not to rely too much on compilers optimizations, so I'd follow Ryan Fox's advice: when I can use both, I use ++i.

    0 讨论(0)
提交回复
热议问题