Incrementing and decreasing i is not working properly
以下两行代码没有返回相同的值。有什么理由吗?
1 2 3 4 | int i; i = 1; i = i + i++; //Returns 2, expecting 3 |
和
1 2 | i = 1; i = i++ + i; //Returns 3 |
从语义上讲,这应该是相同的
与减少
1 2 | i = 1; i = i - i--; //Returns 0, expecting 1 |
和
1 2 | i = 1; i = i-- - i; //Returns 1, expecting -1 |
更让我困惑的是后增量运算符的用法:
1 2 | i = 1; i = i + ++i; //Returns 3 |
和
1 2 | i = 1; i = ++i + i; //Returns 4, expecting 3 |
与递减运算符相同:
1 2 | i = 1; i = i - --i; //Returns 1 |
和
1 2 | i = 1; i = --i - i; //Returns 0, expecting -1 |
最后一个问题:
编译器如何解释这两行?
1 2 | i = i+++i; // is it i + ++i or i++ + i? i = i---i; // is it i - --i or i-- - i? |
1 | i = i + i++; //Returns 2, expecting 3 |
称为后增量。值将首先使用,然后递增。它相当于
1 2 | i = i + i; i = i+1; |
这是预增量。值将先递增,然后使用。
1 | i = i++ + i; //Returns 3 |
等于
1 2 | i = i+1; i = i + i; |
i = i+++i; // is it i + ++i or i++ + i?
被解释为
i=i+1;i=i+i;
而这
i = i---i; // is it i - --i or i-- - i?
被解释为
1 2 | i= i-1; i = i-i; |
预增量(
预增量将在使用结果之前添加值。后增量将使用reslt。然后添加值。所以,你的第一个例子是:
1 2 3 4 5 | int i; i = 1; i = i + i++; // First use equals 1, second use equals one. After this line though // i equals 2, because of your use of post-increment. |
同样,您的第二个示例:
1 2 3 | i = 1; i = i++ + i; // First use is 1. After the first use.. it is incremented.. // The second use it is 2. Therefore, 1 + 2 == 3. |
至于你最后一个问题…为什么不把它放到一个控制台应用程序中,自己试试呢?
我认为试图理解这一点的最好方法,就是看看编译器是如何理解这一点的。
请参阅此处了解案例的概述
1 | x=i-- - --i; |
https://stackoverflow.com/a/8573429/959028
最好的问候
递增或递减运算符的优先级始终高于算术运算符,如+-*/
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx。另外,后固定递增或递减运算符的值只有在当前语句之后才有效。例如:
1 2 3 4 5 6 | i = i + i++ = 1 + 1++ = 1 + 1 = 2; // value of i is effective after increament is done i = i++ + i = 1++ + 2 = 3; //Next value of i contains updated value i.e. 2 i = i + ++i = 1 + ++1 = 1 + 2 = 3; //Next value of i contains updated value i.e. 2 i = ++i + i = ++1 + i = 2 + 2; //Both value of i contains updated value i.e. 2 because of prefixed operator i = i+++i = i++ + i; i = i---i = i-- - i; |