0 0

关于不用第三变量交换2个变量的值???20

public class Test {
public static void main(String[] args) {
int a = 1;
int b = 2;
a = b + (b = a) * 0;  //这句实现交换
System.out.println("a:" + a + "  b:" + b);
}
}

最近朋友给一道题,不用第三变量交换2个变量的值,手法很高明,但不知道原理.
大家一起分析下,怎么完成的,内存分析更好...

问题补充:
先感谢lewhwa的回答,不理解的第四步此时b的值应给为1,也就是1+0=1;为什么还是2呢?


这个巧妙运用了语言的运算符优先级(右侧优先,括号优先)。
首先,从右边开始。然后是这样的步骤:
1.b=2 已经保存了2;准备计算后边。
2.()>*,将a->b,此时=1;
3.1*0=0;
4.再将2+0=2赋值给a。从而完成整个交换。
OO 
2009年2月12日 18:07

4个答案 按时间排序 按投票排序

0 0

采纳的答案

对于这段代码片段:

int a = 1; 
int b = 2; 
a = b + (b = a) * 0;

如果将其转换为静态单赋值形式,并限制每个语句都是一个二元运算与一个赋值,就变成:
int a0 = 1;
int b0 = 2;
int b1 = a; // (b = a)
int temp1 = b1 * 0; // (b = a) * 0
int a1 = b0 + temp1; // b + (b = a) * 0

这样就比较明显了:a0、b0是交换前的值,a1、b1是交换后的值。
说真的这样写只是在自己的代码里少用了个临时变量而已。编译器还是得插入一些临时变量,并不是说自己少用了显式的变量就等于实际运行效率高。

以前也碰到过类似的“优化”的误解,记了一篇,这里http://rednaxelafx.iteye.com/blog/134002

2009年2月13日 00:09
0 0

引用
1.b=2 已经保存了2;准备计算后边

这个先做,早就在呆在内存里咯!

2009年2月12日 23:43
0 0

引用
a = b + (b = a) * 0;  //这句实现交换

这个巧妙运用了语言的运算符优先级(右侧优先,括号优先)。
首先,从右边开始。然后是这样的步骤:
1.b=2 已经保存了2;准备计算后边。
2.()>*,将a->b,此时=1;
3.1*0=0;
4.再将2+0=2赋值给a。从而完成整个交换。

2009年2月12日 21:25
0 0

位运算,a=a^b;b=a^b;a=a^b;05年人家问过我同样的问题,具体你化成2进制算一下就知道了。

2009年2月12日 18:34

相关推荐

    不用第三方变量交换两数的值

    在编程中,交换两个数值是常见的操作,但有时我们可能会面临一种情况,即不允许使用额外的(第三方)变量来辅助交换。这个问题在各种编程语言中都有不同的解决方案,下面我们将详细探讨几种主流的方法。 首先,我们...

    PHP不用第三变量交换2个变量的值的解决方法

    通过先将两个变量相加的值赋给第一个变量,然后再用第一个变量减去第二个变量的原值赋给第二个变量,最后再用第一个变量的当前值减去第二个变量的现值赋回第一个变量,从而完成变量值的交换。 在编码时,需要注意...

    Python3之不使用第三方变量,实现交换两个变量的值

    ### Python3之不使用第三方变量实现交换两个变量的值 在编程中,交换两个变量的值是一个常见的操作。通常的做法是引入一个临时变量来完成这一过程。然而,在Python这种动态语言中,我们可以采用更为简洁的方式来...

    PHP互换两个变量值的方法(不用第三变量)

    * 使用substr()结合strlen()两个方法达到交换变量值得目的 */ $a = This is A; // a变量原始值 $b = This is B; // b变量原始值 echo '交换之前 $a 的值:'.$a.', $b 的值:'.$b,' '; // 输出原始值 $a .= $b...

    Java两个变量的互换(不借助第3个变量)具体实现方法

    在Java编程中,有时我们需要交换两个变量的值,但又不希望使用额外的第三个变量来辅助这个过程。这种情况下,可以利用位运算中的异或(XOR)操作符来实现两个变量的互换。本文将详细讲解如何通过异或运算在Java中不...

    c代码-2.功能:不用第三个变量,实现两个数的对调操作。

    在C语言编程中,对调两个变量的值是一项常见的任务,通常我们使用第三个临时变量来完成这个过程。但是,有一种巧妙的方法可以在不使用第三个变量的情况下实现两个数的对调,这种方法利用了算术运算和赋值操作的结合...

    不使用中间变量,交换int型的 a, b两个变量的值。

    总结来说,不使用中间变量交换两个变量的值有多种方法,包括位运算、算术运算、数组存储和对象属性。不同的方法适用于不同的场景,位运算和算术运算通常更快,但需要考虑溢出和数据类型限制;数组存储和对象属性方法...

    JS实现不用中间变量temp 实现两个变量值得交换方法

    利用数组的灵活性,可以将一个变量的值存储到数组的第一个位置,另一个变量的值存储到第二个位置,然后通过数组访问顺序来交换它们: ```javascript var a = 1; var b = 2; a = [b, b = a][0]; // 现在 a = 2, ...

    你必须知道的495个C语言问题

    第3章 表达式 求值顺序 3.1 为什么这样的代码不行?a[i]=i++; 3.2 使用我的编译器,下面的代码inti=7;printf("%d\n",i++*i++);打印出49。不管按什么顺序计算,难道不该是56吗? 3.3 对于代码inti=3;i=i++;...

    《你必须知道的495个C语言问题》

    第3章 表达式 33 求值顺序 33 3.1 为什么这样的代码不行?a[i]= i++; 33 3.2 使用我的编译器,下面的代码int i= 7; printf("%d\n", i++ * i++); 打印出49。不管按什么顺序计算,难道不该是56吗? 33  3.3 ...

    C语言FAQ 常见问题列表

    o 4.4 这是个巧妙的表达式: a ^= b ^= a ^= b 它不需要临时变量就可以交换 a 和 b 的值。 o 4.5 我可否用括号来强制执行我所需要的计算顺序? o 4.6 可是 && 和 || 运算符呢?我看到过类似 while((c = getchar())...

    必须知道的495个C语言问题

    这个表达式利用异或操作的性质来交换两个变量的值。由于异或操作具有交换律和结合律,所以可以不用额外的变量完成交换。 #### 3.5 我是否可以用括号来强制执行我所需要的计算顺序? 可以使用括号来改变运算符的...

    你必须知道的495个C语言问题(PDF)

    3.10 如果我不使用表达式的值, 我应该用++i 或i++ 来自增一个变量 吗? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.11 为什么如下的代码int a = 100, b = 100; long int c = a * b;...

    2022年9月全国计算机等级《二级C++》上机临考冲刺试卷(8).docx

    9. **交换变量**:第九题展示了如何不用第三个变量交换两个数。通过相加和相减,可以实现a和b的对调,正确答案是`a = a - b`。 10. **类与对象**:第十题提到,C++中构造函数不能被继承,而转换函数、虚函数和静态...

Global site tag (gtag.js) - Google Analytics