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个变量的值的解决方法

    本篇文章是对在php中交换两个变量的值的方法进行了详细的分析介绍,需要的朋友参考下

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

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

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

    今天小编就为大家分享一篇Python3之不使用第三方变量,实现交换两个变量的值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

    主要介绍了Java两个变量的互换(不借助第3个变量)具体实现方法,需要的朋友可以参考下

    你必须知道的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程序设计习题参考(谭浩强三版)习题参考解答

    第3章 数据类型、运算符与表达式 2 3.3请将下面各数用八进制和十六进制数表示: 2 3.4将以下三各整数分别赋给不同类型的变量,请画出赋值后数据在内存中的存储形式。 2 3.5字符常量和字符串常量有什么区别? 3 ...

    C语言FAQ 常见问题列表

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

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

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

    javascript入门笔记

    var 变量名1=值,变量名2=值,变量名3; 3、变量名命名规范 1、由字母,数字,下划线以及 $ 组成 var user_name; 正确 var user-name; 错误 var $uname; 正确 2、不能以数字开头 var 1name;错误 3、不能使用JS...

    c++ 面试题 总结

    2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码) #include using namespace std; void main() { char a[50];memset(a,0,sizeof(a)); int i=0,j; char t; cin.getline(a,50,'\n'); for(i=0,j=...

    计算机二级公共基础知识

    例如,在图1-1中,根结点A在第1层,结点B,C在第2层,结点D,E,F在第3层。该树的深度为3。 子树 在树中,以某结点的一个子结点为根构成的树称为该结点的一棵子树。 2. 二叉树基本性质 二叉树具有以下几个性质: ...

    java 面试题 总结

    抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类...

    asp.net面试题

    第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 2.如何把一个array复制到arrayList里 foreach( object o in array )arrayList.Add(o); 3.datagrid.datasouse可以连接什么数据源 ...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

Global site tag (gtag.js) - Google Analytics