交换两个变量的值, 是很简单的一件事, 只需要有一个临时变量:
int x = 19;
int y = 86;
int temp = x;
x = y;
y = temp;
在long long ago, 当使用寄存器是一件很奢侈的事情的时候, 人们发现有那么一种方法, 可以不使用临时变量:
int x = 19;
int y = 86;
x = x ^ y;
y = x ^ y;
x = x ^ y;
给忘了异或操作的同学复习一下, 省得你们再去Google(当然, 我就是属于忘了现去Google的...): 1 ^ 1 = 0, 0 ^ 0 = 0, 1 ^ 0 = 1, 0 ^ 1 = 1. 不同为1相同为0.
当我们使用某种写作技巧交换2个int的值时:
int x = 19;
int y = 86;
x ^= y ^= x ^= y;
悲剧发生了.
实际上, x = 0, y = 19.
由此, 引发了一个问题, 就是Java中对于x ^= expression这种操作, 是先提取出x的值, 而后计算与expression的异或.
简单来说, Java计算x ^= y ^= x ^= y时:
1.遇到第一个x读出19, 遇到第一个y读出86, 遇到第二个x读出19, 遇到第二个y读出86.
19 ^ 86 ^ (19 ^ 86)
2.计算(第二个x的值)19异或(第二个y的值)86(结果是69)赋给第二个x(注意此时第一个x仍然是19).
19 ^ (86 ^ 69) // 此时, x的值已被更新, 正确的逻辑应当是 69 ^ (86 ^ 69)
3.计算(第一个y的值)86异或(第二个x当前的新值)69(结果是19)赋给第一个y.
19 ^ 19 // 在这里, y的值被正确更新为19, 就是第二个19
4.计算(第一个x的值)19异或(y的新值)19, 得出0并赋给x.
问题就出现在第一次异或之后, 第一个x的值并没有被更新.
分享到:
相关推荐
40.2 分析表达式:问题 40.3 分析一个表达式 40.4 parser类 40.5 剖析一个表达式 40.6 一个简单的表达式分析器 40.7 向分析器中添加变量 40.8 递归下降分析器中的语法检查 40.9 构建一个通用的分析器 40.10 需要试验...
9.2.5 赋值和swap 302 9.2.6 容器大小操作 304 9.2.7 关系运算符 304 9.3 顺序容器操作 305 9.3.1 向顺序容器添加元素 305 9.3.2 访问元素 309 9.3.3 删除元素 311 9.3.4 特殊的forward_list操作 ...
9.2.5 赋值和swap 302 9.2.6 容器大小操作 304 9.2.7 关系运算符 304 9.3 顺序容器操作 305 9.3.1 向顺序容器添加元素 305 9.3.2 访问元素 309 9.3.3 删除元素 311 9.3.4 特殊的forward_list操作 ...
输入函数: 1)函数原形:自定义swap(int *a, int *b)函数 2) 功 能:swap()函数利用取地址符号&完成对程序中某个变量的赋值,进而程序中判断交换的 功能。 3)函数原形:get char() 4)功 能:向计算机输入一个...
9.3.8 赋值与swap 282 9.4 vector容器的自增长 284 9.5 容器的选用 287 9.6 再谈string类型 289 9.6.1 构造string对象的其他方法 290 9.6.2 修改string对象的其他方法 292 9.6.3 只适用于string类型的操作 293 9.6.4...
20.5.7 swap、iter_swap和swap_ranges 20.5.8 copy—backward、 merge、 unique和reverse 20.5.9 inplace_merge、 unique—copy和reverse—copy 20.5.10 集合操作 20.5.11 1ower—bound、 upper—bound和...
20.5.7 swap、iter_swap和swap_ranges 20.5.8 copy—backward、 merge、 unique和reverse 20.5.9 inplace_merge、 unique—copy和reverse—copy 20.5.10 集合操作 20.5.11 1ower—bound、 upper—bound和...
dk2j_c_赋值表达式.mp4 dk2j_c_赋值语句_复合语句_空语句.mp4 KRC0507_多维数组.mp4 lc_流定位.mp4 MCU51_位操作运算符.mp4 MCU51_分支控制.mp4 MCU51_循环控制.mp4 MCU51_编译预处理.mp4 MCU_51_一维数组....
象引用的表达式。 例如:我们用 Point p=newPoint();生成了类 Point 的对象 p 后,可以用 p.x,p.y 来访问该点的 x、y 坐标,如 p.x = 10; p.y = 20; 或者用 new 生成对象的引用,然后直接访问,如: tx=new point().x; 2....
为了正确处理所有权转移问题,create_a()将用来适配返回值策略. 参见 策略 章节. -Linker Lin 4/5/08 6:32 PM struct B: A {}; struct C: B {}; void g(A*); void g(B*); 执行以下 Lua 代码即结果: a1 = create...