EverSpring working shop

To pursue creative ideas based on nature.

统计

留言簿(1)

他山之石

阅读排行榜

评论排行榜

The Remark of Usage for ++ and --

Frankly, I am still very confused with the rule for the usage of the ++ and -- in the expression.
Just try some execise in the g++, it seems that the rule for ++/-- is:

As post-increment (X++) or post-decrement (X--), it alaways takes effect after the whole expression is done, even after the assignment is completed;
As pre-increment (X++) or pre-decrement (X--), the ++/ -- firstly takes effect at the place where it is, and then the expression is executed.

For example:
A)
   int incr = 3;
   incr = (incr++)*4 + (incr++)*3 + 4;

After the execution, the incr is 27.
Steps:
1. incr = 3*4 + 3*3 + 4 = 25;
2. incr = incr + 2 = 27.

B)
    incr = 3;
    incr = (incr--)*4 + (incr--)*3 + 4;

Result incr is 23;

C)
    incr = 3;
    incr = (--incr)*4 + (--incr)*3 +  (++incr) * 4;
Result is 19.
Steps:
1. incr = (3-1)*4 + (2-1)*3 + (1+1)* 4 = 19

D)
   incr = 3
   incr = (--incr)*4 + (--incr)*3 +  (++incr) * 4 + (incr++);
Result is 22
Steps:
1. incr = (3-1)*4 + (2-1)*3 + (1+1)*4 + 2 = 21
2. incr ++ -> incr = 22.


REMARK Here!

posted on 2009-02-21 20:00 everspring79 阅读(302) 评论(1)  编辑 收藏 引用 所属分类: Notes

评论

# re: The Remark of Usage for ++ and -- 2009-02-21 21:20 everspring79

Another Remark - The evil resides in the combination of below operations:

1) ++/--
2) Macro
3) Function Parms
4) Condition Operation.

Example:
A)
int foo(a, b, c)
{
return (a+b+c);
}

void main()
{
int aa = 5, bb = 4, cc = 3, result;

result = foo(aa++, --bb, cc); // result = (5+3+3), aa = 6 now, bb = 3
result = foo(aa++, ++aa, cc); // result = (7+7+3), aa = 8 now
}

B)
#define MIN(a,b) (((a)<=(b))?(a):(b))

int a = 10, b = 7
d = MIN(++a, b);
//May work well according to gcc.
// d = 7, a still = 10
d = (((a++)<=(b))?(a++):(b)) //as the condition is false, the second a++ will not execut.
// d = 7, a = 11
a = 7;
b = 10;
d = (((a++)<=(b))?(a++):(b)) //as the condition is true, the second a++ is executed, a= 9, but d = 7
d = (((a++)<=(b))?(++a):(b)) // as the condtiion is true, the 2nd ++a is executed, this leads to d to be 9, finally a = 9.
//above is an evil. the first a++ will lead a to be 7+1 before ?.
a = 9; b=10
d= (((a++)<=(b))?(a++):(b)) // antoher evil, the d = 10 because the d is assigned by a = 10 before the 2nd a++. After this a = a+1. so the result is d = 10, a =11.

  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理