纠结这个东西没什么意义,这个问题跟研究茴香豆的茴字有几种写法没什么本质区别如果比较一下,用C、C++、C#、JAVA、javascript、action script、等类C语言分别试一下,以及用不同的编译器,比如 windows 下的 vc, bc 或 linux 下的C编译器,估计结果都会不一样的(本人没试过,只是估计)。楼主的这种写法,可以拿来在某些编程老手面前显摆一下挣点面子,或者是某些高校老师拿这种写法来出题以此折磨学生,除此之外没有什么现实意义。结果反倒是使程序产了歧义。
你把i++这样理解:int temp = i; i = i + 1; return temp;
int i = 0; i=i++; // 先用后加 即 在执行这句时 i还是等于0 ,执行完后i才自加1 为 1 正解的 i=++i; i=1
开始我也迷惑.
如果LZ真正理解了i++的概论就明白了
i++;是指再执行完后便自加1,也就是下次出现i的时候便成1了
而上述i=i++;是属于i++了但是又赋给了i;也就是说.i没有再次出现.所以还是0
LZ这问题不必太过纠结
++i 先加后用
也就是说int i = 0;
i=i++; // 先用后加 即 在执行这句时 i还是等于0 ,执行完后i才自加1 为 1楼主写几个小测试例子就明白了 这跟语法没有冲突
++i的意思: i = i + 1; -> doSomething(i);
i++的意思: doSomething(i); -> i = i + 1;
---------
比如:
int i=0,j=3;
j=i++;//j=0,i=1。
//上述语句相当是: j=i;i++两个语句。
http://hi.baidu.com/freish/blog/item/aa947f8b42c4e118c9fc7a07.html
public class Test {
public static void main(String... args) {
int i = 0;
i = i++;
System.out.println(i);
}
}使用javac编译后再使用javap -c Test反编译这个类查看它的字节码,如下(只摘取main方法):public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_1
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
这里,我从第0行开始分析(分析中【】表示栈,栈的底端在左边,顶端在右边):
0:将常数0压入栈,栈内容:【0】
1:将栈顶的元素弹出,也就是0,保存到局部变量区索引为为1(也就是变量i)的地方。栈内容:【】
2:将局部变量区索引为1(也就是变量i)的值压入栈,栈内容:【0】
3:将局部变量区索引为1(也就是常量i)的值加一,此时局部变量区索引为1的值(也就是i的值)是1。栈内容:【0】
6:将栈顶元素弹出,保存到局部变量区索引为1(也就是i)的地方,此时i又变成了0。栈内容:【】
7:获取常量池中索引为2所表示的类变量,也就是System.out。栈元素:【】
10:将局部变量区索引为1的值(也就是i)压入栈。栈元素:【0】
11:调用常量池索引为3的方法,也就是System.out.println
14:返回main方法
i=++i是先加后赋值
取的最终值是在栈里面取的吗?
i = i + 1;
return temp;
i=i++; // 先用后加 即 在执行这句时 i还是等于0 ,执行完后i才自加1 为 1
正解的
i=++i;
i=1
先取得i,将i加1,
然后将刚才取得的值赋给i