#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 * */
那就是符号优先级的问题呗,这种代码还是少写。。。毕竟,编程不是炫技。。。
这是一个题目上的,我同学问起。在 Java 中编写出来和它的结果一样。在 C++中就不一样了。所以来问一下。感谢你回答
@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
@顾晓北: 您好,我能再问一下。 为什么 Java 中 那个k 在计算的时候不会变吗? 我所理解的是 因为 C++和Java 中 对于 i 和 k 应该都是属于值变量类型。所以传入方法时计算其实只是传进去一个副本。并不是传入本身。但是为什么 同为值变量。 在Java 中计算 k+=k-=k*=k 时 k 不变, 而 i+=i-=i*=i 时 i 却变了呢 ?
十分感谢您的回答。
@BUTTERAPPLE: 具体人家是怎么实现底层的,这是人家的自由而已,所以我说,编程不是炫技,不提倡这种做法,即使你是个很牛逼的高手,也不建议敲这种代码,因为你不知道他的底层是怎么实现的。。。
@顾晓北: 谢谢你啦。
两门不同的语言,语法细节上的不同,很奇怪吗?
首先感谢您的回答,其实我想知道一下具体在哪不同。
@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++运算符结合性
虽然看起来很酷炫,但是我本人鄙视这种代码。
您好,我是来请求解惑的,并不是来炫酷或者什么,谢谢。