Difference between pre- and postfix incrementation in C (++a and a++)

537 views Asked by At

As far as I understand, a++ is postfix incrementation, it adds 1 to a and returns the original value. ++a is prefix incrementation, it adds 1 to a ad returns the new value.

I wanted to try this out, but in both cases, it returns the new value. What am I misunderstanding?

#include <stdio.h>
int main() {
  int a = 0;
  int b = 0;

  printf("%d\n", a); // prints 0
  printf("%d\n", b); // prints 0

  a++; // a++ is known as postfix. Add 1 to a, returns the old value.
  ++b; // ++b is known as prefix. Add 1 to b, returns the new value.

  printf("%d\n", a); // prints 1, should print 0?
  printf("%d\n", b); // prints 1, should print 1

  return 0;
}
4

There are 4 answers

5
Qix - MONICA WAS MISTREATED On BEST ANSWER

Remember, C and C++ are somewhat expressive languages.

That means most expressions return a value. If you don't do anything with that value, it's lost to the sands of time.

The expression

(a++)

will return a's former value. As mentioned before, if its return value is not used right then and there, then it's the same as

(++a)

which returns the new value.

printf("%d\n", a++); // a's former value
printf("%d\n", ++b); // b's new value

The above statements will work as you expect, since you're using the expressions right there.

The below would also work.

int c = a++;
int d = ++b;

printf("%d\n", c); // a's former value
printf("%d\n", d); // b's new value
0
Gopi On

No a is also incremented by 1.

If you have something like

p = a++;

Here

p = 0

and if you have

p = ++a;

Here

p =1

So you can assign the value of your variable to some other as shown above and test what happens with post and pre incrementation.

5
Sourav Ghosh On

In case of prefix increment, the ++.. operator is evaluated and the increment is performed first, then that incremented value becomes the operand.

In case of post increment, the ..++ operator is evaluated and the increment is scheduled once the other evaluations including that operand are finished. It means, the existing value of the operand is used in the other evaluation and then the value is increased.

To understand it better, use two more variables, c and d, and check the values as below.

#include <stdio.h>
int main() {
  int a = 0;
  int b = 0;
  int c = 0;
  int d = 0;   

  printf("%d\n", a); // prints 0
  printf("%d\n", b); // prints 0

  c = a++; // a++ is known as postfix. Add 1 to a, returns the old value.
  d = ++b; // ++b is known as prefix. Add 1 to b, returns the new value.

  printf("%d\n", a);   // is 1
  printf("%d\n", b);    // is 1
  printf("%d\n", c);    // is 0; --> post-increment
  printf("%d\n", d);    // is 1  --> pre-increment

  return 0;
}
0
Bart Friederichs On

a is incremented, but it returns the old value. But as it is alone on a line, the result is ignored. Try this to illustrate the difference:

#include <stdio.h>
int main() {
  int a = 0;
  int b = 0;

  printf("%d\n", a++);
  printf("%d\n", ++b);

  return 0;
}