java这种值交换的原理是啥
原理也不复杂① 参数求值顺序是固定的,所以后面的赋值表达式不会影响到前面的参数传递。② 赋值表达式本身是有返回值的,所以可以作为参数存在,同时又有副作用。但是:这中写法没有什么意义,还不如老老实实的用第三个变量交换一下直观。
■网友
来来来,我们来扒一下bytecode就知道了。首先写一段Java程序来迎合题主的意思:import java.lang.*;class SwapValue { public static int getItself(int itself, int dummy) { return itself; } public static void main(String args) { int a = 10; int b = 20; a = getItself(b, b = a); }}基本上就是这个意思了。然后我们把它搞成字节码:javac -g SwapValue.javajavap -c -v -p -s SwapValue 然后就会搞出一堆JVM bytecode如下:Classfile /E:/javacmd/SwapValue.class Last modified 2016-1-13; size 543 bytes MD5 checksum d921cb8c1c03b75853a9412edca8ca4f Compiled from "SwapValue.java"class SwapValue minor version: 0 major version: 52 flags: ACC_SUPERConstant pool: #1 = Methodref #4.#25 // java/lang/Object."\u0026lt;init\u0026gt;":()V #2 = Methodref #3.#26 // SwapValue.getItself:(II)I #3 = Class #27 // SwapValue #4 = Class #28 // java/lang/Object #5 = Utf8 \u0026lt;init\u0026gt; #6 = Utf8 ()V #7 = Utf8 Code #8 = Utf8 LineNumberTable #9 = Utf8 LocalVariableTable #10 = Utf8 this #11 = Utf8 LSwapValue; #12 = Utf8 getItself #13 = Utf8 (II)I #14 = Utf8 itself #15 = Utf8 I #16 = Utf8 dummy #17 = Utf8 main #18 = Utf8 (); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=3, args_size=1 0: bipush //push 10 -\u0026gt; stack 2: istore_1 //pop 10 -\u0026gt; local1\t\t //---------------------------------------\t\t // int a = 10; 从栈中出栈整数10,赋值给本地变量1 (a)\t\t 3: bipush //push 20 -\u0026gt; stack 5: istore_2 //pop 20 -\u0026gt; local2\t\t //---------------------------------------\t\t // int b = 20; 从栈中出栈整数20,赋值给本地变量2 (b)\t\t 6: iload_2 ;push local2 -\u0026gt; stack;\t\t //---------------------------------------\t\t //将本地变量2(b)压栈,作为调用getItself的参数1\t\t 7: iload_1 //push local1 -\u0026gt; stack; 8: dup //push local1 -\u0026gt; stack; 9: istore_2 // //pop a -\u0026gt; local2 (b = a)\t\t //将本地变量1(a)压栈两次,然后再出栈一次赋值给本地变量2(b),在这里完成了b = a\t\t //调用getItself的参数2实际上是栈里面剩下的那个第一次压入的本地变量1的值,也就是a\t\t 10: invokestatic #2 // Method getItself:(II)I\t\t//调用函数,此时参数在栈里面:参数1:b, 参数2:a 看到这里请转到函数体内部\t\t\t\t//从函数返回时,返回值b被压入堆栈 13: istore_1 ;pop 函数返回值b -\u0026gt; 本地变量1(a) (也就是:a = 返回值) 14: return LineNumberTable: line 9: 0 line 10: 3 line 11: 6 line 12: 14 LocalVariableTable: Start Length Slot Name Signature 0 15 0 args [Ljava/lang/String; 3 12 1 a I 6 9 2 b I}SourceFile: "SwapValue.java"
推荐阅读
- 家里这种床单可不要扔了,要比古董还值钱,难怪有钱人都收藏起来
- 『呼吸衰竭』这种病小心拖成呼吸衰竭! 天冷了别大意
- 坐标合肥,请问在哪里能捕捉到程序员这种生物他们大都出现在哪里呢
- 西安两男子从网上学会这种技术,竟专门用来......刑拘!
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采
- 交换机,路由器经常性的死机咋办
- 啥人会去买iPhone 8这种产品呢
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 「巧克力中富含黄烷醇,能够增强脑部活动能力;因此人均巧克力消费量越高的国家,按人口平均计算的诺贝尔奖得主人数就越多。」这种说法科学么
- 人类能证明除了自己,其他人也有意识吗(我有意识,其他人也一定有这种方式不算)
