java执行下面的代码:
int a = 12;
int b = 123;
a = b + (b = a) * 0;
System.out.println("a="+a);
System.out.println("b="+b); 答案:
a=123;b=12; 为什么????
int a = 12;
int b = 123;
a = b + (b = a) * 0;
System.out.println("a="+a);
System.out.println("b="+b); 答案:
a=123;b=12; 为什么????
解决方案 »
- 这种socket数据该怎样读??
- 请高手指正关于插入排序问题
- java.lang.UnsatisfiedLinkError: /usr/local/j2sdk1.4.2_05/jre/lib/i386/libawt.so: libXp.so.6: cannot open shared object file: No
- 数据碰撞比对的实现方法问题?!有兴趣的朋友帮帮忙
- 有点小问题,希望各位兄台给看看,我是个新人,渴望以后能多交流。
- 为什么我一开机,java.exe进程就把我的cpu占掉了95%,我好象没有运行什么java程序啊??
- 为什么我有时候看csdn贴子的时候会出现这样的错误?
- 我是java初学者,高手给点学习方法!
- 判斷兩個char[]相等用什麽函數?我用(char1.equals(char2))它總是認爲不等,爲什麽??
- 弹出对话框(谢谢大侠帮忙)
- 奇怪的java字符串
- 面试题求解:String 引用变量占用的内存为多少字节?
a = b + (b = a) * 0; a=123,运算从左到右
System.out.println("a="+a);
这又是个编译器上读取的问题,估计用的堆栈,先进后出,()内先进,所以最后出来,然后是乘法先进,倒数第二出来,结果就成了这个样子,要彻底搞清楚的话,要读编译器的汇编代码
在a = b + (b = a) * 0中b的值已经更改了
剩下的就是优先级的问题了,()优先级最高,“*”号次之
2 istore_1 [a] a = 12 []
3 bipush 123 [123]
5 istore_2 [b] b = 123 []
6 iload_2 [b] [123]
7 iload_1 [a] [12, 123]
8 dup [12, 12, 123]
9 istore_2 [b] b = 12 [12, 123]
10 iconst_0 [0, 12, 123]
11 imul [0, 123]
12 iadd [123]
13 istore_1 [a] a = 123 []
c、c++答案跟java、c#一样的,运算顺序不一样的
没那么麻烦,给你说简单点。
这是个赋值运算,要知道a的值,要看给a赋得什么值。
“a = b + (b = a) * 0;”“(b = a) * 0”整体为零。则“a=b+0”
给a 赋值为b。
再看给b赋的值,(b=a)把a的值赋给了b。
现在a的值与b的值交换了。
就这样。
http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javap.html看看这个吧
祝你早日成为Java界泰斗
int b = 123; a = b + (b = a) * 0; 上面的公式步骤应该是:
a = 123 + (b = a) * 0;
a = 123 + (b = 12) * 0; //将12赋值给b
a = 123 + 12 * 0;
a = 123所以最后a = 123; b = 12
int b = 123;
a = b + (b = a) * 0;
代码是先运算了(b=a),在此处b已经被赋值12,所以b=12;然后运算(b = a) * 0 此部分整体为0,后运算a = b + (b = a) * 0,
即变为a=b+0 所以a=123
想不用第三参数进行值交换甚至不用0,可以这样写
int a = 111;
int b = 222;
b = a + b;
a = b-a;
b = b-a;
System.out.println(a + "==aaa");
System.out.println(b + "==bbb");
只见过
a = a ^ b;
b = b ^ a;
a = a ^ b;
学习了
System.out.println("a="+a);
System.out.println("b="+b);
从代码来看b=12很容易理解,因为把a的值12赋给了b ,所以b的值为12 然而a为什么是123,而不是12这个问题就要考虑到jvm的执行方式了
比如:int i = 1;
i = i ++;
Sytem.out.println(i);
为什么打印出来i的值是1而不是我们想的2;
这也不能用简单的逻辑所能说明的!只能考虑到jvm了,所以楼主你如果要弄清还是建议你去看下jvm的执行原理,就可以解决上面是为什么那样的结果了!!
因为 在运行时候 b = a 这时候,b 当然就是12了
而a为什么等于 123呢
在运算时,(a = b) 这个表达式返回的是false ,(b = a) * 0 也就是 0 * 0
所以 a = b + 0;
故: a = 123;
虚拟机找到了最后一次赋值的表达式,就是那个括号里的b=a; 后来再也没有赋值给b过了,所以b=12;这是我的理解,希望对你有帮助.
int sum = ai + (++ai) + ai++ + ai;
System.out.println("sum:" + sum);
java执行下面的代码:
int a = 12;
int b = 123;
a = b + (b = a) * 0;
System.out.println("a="+a);
System.out.println("b="+b); 答案:
a=123;b=12; 为什么????
可以简单的从右边往左边看
a的初始值是12,b的初始值是123
在a=b+(a=b)*0的运算中a(a=b)“a赋值给了b,所以最后b=12”,“(a=b)*0的值是0,b+0 在赋值给a,即a=123”,这个属于运算优先级的知识吧
即把a的值赋给了b
最后一行括号中a已经赋给b了,所以b为12。
a = b + (b = a) * 0; 关键是这一句的执行顺序问题。a=12,
b=123执行顺序是:
b = a; -->执行后,b为12
(b = a) * 0; -->计算结果为0
b + (b = a) * 0; -->计算结果为123+0=123
a = b + (b = a) * 0; -->执行后,a为123所以,a=123,b=12。
我想问问80楼的同学,在第一步中 b=12
那么在第三步中b + (b = a) * 0; -->计算结果应该为12+0=12吧
为什么是123呢?
int a = 12;
int b = 123;
a = b + (b = a) * 0;
System.out.println("a="+a);
System.out.println("b="+b); 答案:
a=123;b=12; 为什么????
先算括号 b = 12
再算乘法 12*0=0
在赋值 a = 123 + 0;
还有他是从上往下逐行运行
当运行到System.out.println("b= " + b);的时候回调用它最近的一个b。
不知道这样理解对不 因为我才开始学java