i=3;
i=i--;
System.out.println(i);
这个编辑器后台是如何去运算的。
java编辑器、C的编辑器得到的结果会不一样 eclipse 和 VC6.0编辑运行的结果是一样的,有些编辑器不一样
这和编辑器没有关系,这是编译器决定的。
我已经多次回答这个问题了,这是语言未定义行为,换一句话说,这里同一个代码有不同的理解方式,语言规范没有规定必须使用哪种理解方式
所以不同的编译器可以编译成不同的代码,自然结果就不同了。
我觉得以C语言的逻辑来看,怎么运行结果都是2啊
i=i--; 这句话相当于 i--;
所以应该答案是一样的吧
关于未定义行为,我再举一个例子,你们学校的老师出了一个题目,请计算1+2+...+n=?
小明的程序这么写的
int foo(int n)
{
return (1 + n) * n / 2;
}
小军的程序这么写的
int foo(int n)
{
int sum = 0;
for (int i = 1; i <= n) sum += i;
return sum;
}
这两个程序都是对的。
但是请注意,这两个程序不等价。比如说foo(-100),两个程序返回的结果是不同的。
编译器也是如此
语言规范就是老师布置的题目
VC++ Java等等就是不同的学生去做这个题目
一些代码,比如你说的那个,就是属于超过题目范围的输入情况(编译器就是一个把源程序当作输入,得到目标程序的程序)
对于语言规范要求的,编译器的输出必须确定,就好比两个程序接收一个大于1的整数输出是一样的。
对于超过规范的,编译器的输出可以相同可以不同
其实C里面有大量的未定义行为
http://blog.csdn.net/wuhui_gdnt/article/details/8736838
http://www.guokr.com/blog/471312/
http://blog.jobbole.com/53211/
(文章中列出的只是冰山一角)
如1楼所说,这是C语言的一个未定义行为,不同的编译器就不同的解释,有的会先将i减减在赋给i,有的先赋值再减减,C语言没有规定必须先执行哪个。所以要想使你的程序可移植的话就不要用这种语句。
http://blog.chinaunix.net/uid-13701930-id-336476.html
过程:tmp = i,i=i-1,i=tmp;
。。又玩这种语法效果,囧,这个建议是还是别玩语法糖 了撒
i--是先赋值,然后i再减1,至于有些编译器的效果不一样,就要看编译器的内部的设定了
你想说的是编译器吧?!
这个是编译器导致的区别
这是编译器的问题。 另外如果不是为了榨取极限性能,最好还是别用这种写法。