首页 新闻 赞助 找找看

为什么 下面这段代码 C++ 和 Java 在 上不同?i+=i-=i*=i

0
[已解决问题] 解决于 2016-09-10 17:10
#include<stdio.h>//在C++中的结果
int Change(int i);
main(){
int i=7;
int j=Change(i);
printf("%d ,  %d",i,j);
} 
int Change(int i){
return i+=i-=i*=i;
} 

/*
7 ,  0
-----------------------------------------------
Process returned: 0 (0x0)
Execution time: 14 ms
Maximum memory use: 407 KB
-----------------------------------------------
Press any key to continue . . .

*/



//在 Java中的运行结果
/**
 * Created by Xi Yin on 2016/9/8.
 */
public class TestPlusPlus {
public static void main(String[] args){
int i=6;
        System.out.println(i);
int j=Change(i);
        System.out.println("Value1: "+i+" Value2: "+j);
    }
public static int Change(int k){
return k+=k-=k*=k;
    }
}
/*
*
6
Value1: 6 Value2: -24
Process finished with exit code 0

* */
BUTTERAPPLE的主页 BUTTERAPPLE | 老鸟四级 | 园豆:3190
提问于:2016-09-10 09:01
< >
分享
最佳答案
1

那就是符号优先级的问题呗,这种代码还是少写。。。毕竟,编程不是炫技。。。

奖励园豆:5
顾晓北 | 专家六级 |园豆:10844 | 2016-09-10 09:15

这是一个题目上的,我同学问起。在 Java 中编写出来和它的结果一样。在 C++中就不一样了。所以来问一下。感谢你回答

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2016-09-10 10:18

@BUTTERAPPLE: 刚才仔细分析了一下,发现可能的情况是这样的:

两种都是从后往前运算,但是运算过程中,Java的K的值一直没变,所以Java等同于这样:

k=6+6-6*6;最后是-24;

而C++是每次运算完以后,i就变了,所以是:

i=i*i;这时候i是49;

i=i-i;这时候等于49-49,等于0;

i=i+i;这时候等于0+0,等于0;最后等于0

顾晓北 | 园豆:10844 (专家六级) | 2016-09-10 10:29

@顾晓北: 您好,我能再问一下。 为什么 Java 中 那个k 在计算的时候不会变吗? 我所理解的是 因为 C++和Java 中 对于 i 和 k 应该都是属于值变量类型。所以传入方法时计算其实只是传进去一个副本。并不是传入本身。但是为什么 同为值变量。 在Java 中计算  k+=k-=k*=k 时 k 不变, 而 i+=i-=i*=i 时 i 却变了呢 ?

十分感谢您的回答。

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2016-09-10 10:44

@BUTTERAPPLE: 具体人家是怎么实现底层的,这是人家的自由而已,所以我说,编程不是炫技,不提倡这种做法,即使你是个很牛逼的高手,也不建议敲这种代码,因为你不知道他的底层是怎么实现的。。。

顾晓北 | 园豆:10844 (专家六级) | 2016-09-10 10:49

@顾晓北: 谢谢你啦。

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2016-09-10 11:02
其他回答(2)
0

两门不同的语言,语法细节上的不同,很奇怪吗?

吴瑞祥 | 园豆:29449 (高人七级) | 2016-09-10 09:28

首先感谢您的回答,其实我想知道一下具体在哪不同。

支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2016-09-10 10:19

@BUTTERAPPLE: 我的问题我没认真看题目.查了下他们的语法是一样的.那就是编译器的问题.

原因可能是楼上猜的那样.但我不懂就不乱说了.

i+=i-=i*=i;=>  i+(i-=i*=i)   =>  i+(i-( i*=i)) => i+(i-(i*i)) 

http://blog.chinaunix.net/uid-12370487-id-2944053.html  java运算符结合性

http://www.cnblogs.com/nanyangzp/p/3610624.html C++运算符结合性

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-09-10 10:48
0

虽然看起来很酷炫,但是我本人鄙视这种代码。

nullcc | 园豆:202 (菜鸟二级) | 2016-09-10 10:44

您好,我是来请求解惑的,并不是来炫酷或者什么,谢谢。

支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2016-09-10 10:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册