/*
Java基础,两个变量的数值互换。
这里只考虑Java语言,因为不同语言的机制不同,Java可以执行的,C未必可以,而C可以的,Java也未必能行,
毕竟每种语言都有自己独特的魅力~。◕‿◕。
*/
/*
1:最简单,最好理解的方法:引入第三个内存,即设置第三个变量。
假如有一瓶可口可乐和一瓶雪碧,现在想用可口的瓶子装雪碧,用雪碧的瓶子装可口(不要问我为什么要换瓶子,就是任性╮(╯3╰)╭),
这个方法就是再找个空瓶。
*/
temp = a;
a = b;
b = temp;
/*
2:这里是位运算,在计算机底层操作。
位异或特点:左右两边是数据,相同为0,不同为1。某一个数对另一个数异或两次得到的结果是其本身。
*/
a = a^b; //将a^b赋值给=>a,此时a的值是a^b;
b = a^b; //(a^b)^b => b,这时b就变成a原来的值了;
a = a^b; //(a^b)^((a^b)^b) => a,将a变成b。
/*
2.1:注意!不要轻易尝试压缩代码,要是写成下面这种就错啦!a会变成0……
*/
a^=b^=a^=b;
/*
2.2:但是写成下面这种就可以,原因嘛,我也不知道_(:3 」∠)_
*/
a^=b^=a;
b^=a;
/*
3:不用第三个变量,而引入第三个数据的方法,就是加减乘除法。但是要注意!变量数值较大时可能会溢出。
*/
a = a+b; //a+b => a
b = a-b; //(a+b)-b => b
a = a-b; //(a+b)-((a+b)-b) => a
/*
3.1:
*/
a = a-b;
b = a+b;
a = b-a;
/*
3.2:用这种方法时又多了一个限制:b不能为0。
*/
a = a*b;
b = a/b;
a = a/b;
/*
4:加减乘除赋值混合法~简直像和稀泥ಥ_ಥ
*/
a = b + (b = a)*0;
/*
这是充分利用运算符的优先级别和顺序做出来的,首先要了解两件事。
赋值运算符的优先级别是很低的,并且运算顺序是从右至左。
也就是说b = a + ( a = b ) * 0会先算右边的a + ( a = b ) * 0。
加法运算符的优先级别比赋值运算高,并且运算顺序是从左至右。
所以a + ( a = b ) * 0会先计算左边的a,然后再计算( a = b ) * 0,就是这个顺序使得a的值可以暂存。
剩下的事情就是把a=b这个表达式的值给消掉了,方法也很简单。
*/
/*
4.1:
*/
a = a + b - (b = a);
/*
5:加减乘除还能组合出很多好玩的方法~
*/
a = a-b; //a-b=>a
b = a+2*b; //(a-b)+(b+b)=a+b=>b
b = (a+b)/2; //((a-b)+((a-b)+(b+b)))/2=a=>b
a = b-a; //a-(a-b)=b=>a
/*
除了三变量方法外,其他方法要么在计算机底层操作,要么进行算数运算,除了在新手面前装X外还有其他作用嘛? (╯‵□′)╯︵┻━┻
一:运行速度慢;
二:一定程度上影响了代码的直观;
三:加减,乘除及其他花样的交换有溢出问题。
所以三变量交换法远比这些花样作死的运行快,而且清晰直观。
在现代的计算机编程中,内存的使用量都是极大的,多一个变量内存完全可以忽略,倒是时间的考量越发严格,
假如在一个需要进行大量交换操作,同时又需要保证稳定性的程序中,三变量法却是最好的选择。
没想到最后,看起来最朴实的却是最优秀的~
所以作为朴实的敲代码的程序猿(媛)们是最棒哒~ (╭ ̄3 ̄)╭♡
*/
|