a=b+(b=a)*0是如何编译

pengdean 2007-09-29 01:14:12
加精
我在torboc 在运行该等式是交换a,b值,但不知道为什会这样。请高手指点下。该等式是怎样一步一步运行。在turboc 此等式一步就运行玩。分开运行就会是不同的结果
...全文
3808 130 打赏 收藏 转发到动态 举报
写回复
用AI写文章
130 条回复
切换为时间正序
请发表友善的回复…
发表回复
来到我身边 2012-08-02
  • 打赏
  • 举报
回复
公说公有理。婆说婆有理。到底谁对
acmilan1984 2009-02-24
  • 打赏
  • 举报
回复
C++
要这样才能实现这个功能

void main(void)
{
int a=13;
int b=31;
a = (a+b-a) + (b = a) * 0;
}
tiger999 2009-01-07
  • 打赏
  • 举报
回复
赋值语句先求解表达式

b+(b=a)*0
1> b=a // a 赋值给了b
2> (b=a)*0 // 表达式 = 0
3> b+ 0 = b
4> a=b // b 赋值给了 a

IL 中没有赋值是因为编译器做了优化。
hiter983 2008-12-08
  • 打赏
  • 举报
回复
看上去是有问题,如果要求不用临时变量的话,建议使用下面的方法同样可以实现交换。

a += b;
b = a - b;
a = a - b;
wangxi511 2008-07-29
  • 打赏
  • 举报
回复
Ivony 说的很有道理,他发的那篇贴我也看了,我觉得这个不是BUG,
让我们了解到了各个语言的编译机理,我觉得不管怎么样,对我们或多或少都是有帮助的。
ouhaibing 2008-07-28
  • 打赏
  • 举报
回复
同123
qdhhwy 2008-07-24
  • 打赏
  • 举报
回复
学习中啊!谢谢
chinapp 2008-06-01
  • 打赏
  • 举报
回复
a=b+(b=a)*0

这种类似的东西以前大学的时候碰到过,我们老师也讲过。

有些编译器会把第一个b作为一个值储存到内存用作计算,而有些编译器会把第一个b作为变量b的一个类似于指针的东西。
第一种方法耗内存但是速度快,第二种方法省内存。如果b是一个很长很长的string,你就明白了。
搞单片机的人这种问题每天都要碰到,省缓存呗。
cyz645172 2008-05-15
  • 打赏
  • 举报
回复
113楼说的有点道理啊
AaronBCR 2008-05-09
  • 打赏
  • 举报
回复
大家的回复我没有仔细看。
个人认为:1、这种编程风格是不建议的。2、这个题目的结果就是b=a
wengyuli 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qzj 的回复:]
int a=13;
int b=31;
a = b + (b = a) * 0;

中间语言为:

IL_0001: ldc.i4.s 13
IL_0003: stloc.0
IL_0004: ldc.i4.s 31
IL_0006: stloc.1
IL_0007: ldloc.1
IL_0008: ldloc.0
IL_0009: stloc.1
IL_000a: stloc.0

编译结果实际上就是交换a,b的值,什么乘法,加法都没做。

PS:ldloc -> load local variable onto the stack
stloc -> pop value from stack …
[/Quote]
BinShao_1987 2008-04-18
  • 打赏
  • 举报
回复
a=b+(b=a)*0
个人认为是这样子执行的
a=b;这样就把别的值给a了
在运算()
b=a;就把a的值给b啦
然后就是b+()的东西乘以0当然还是b啊
所有结果就是交换了a和b……
viki117 2008-04-09
  • 打赏
  • 举报
回复
0的*法是不是会自动优化掉,不做乘法。。。
nevgip 2008-04-09
  • 打赏
  • 举报
回复
class t
{
public static void main(String[] args)
{
int a=1;
int b=2;
a = b + (b = a) * 0;
System.out.println("a="+a+","+"b="+b);
}
}

这是java代码,确实交换值了,确实很奇怪,是不是可以认为 b=a和a=b是同时进行的呢?或者说编译器是先运算再取值?
yx_zyb 2008-02-21
  • 打赏
  • 举报
回复
这样子编译后,a和b的值都是一样的。
huanyuan12 2008-02-16
  • 打赏
  • 举报
回复
有点晕!
wonminhoo 2008-02-14
  • 打赏
  • 举报
回复
假设
a=1;
b=2;
a=b+(b=a)*0
这条语句在开始执行的瞬间将全部转移到系统内存中进行计算,
此时a,b值还没有变化,如a=1,b=2

而当括号里 b=a 这条语句执行后结果为 b=a=1
然后是 (b=a)*0 等于 0
这是由于 a=b+(b=a)*0 中 b 第一次出现的位置的缓冲区中的值是不变的,b 仍为 2
那么结果
a = b + (b = a) * 0 可看成
a = 2 + (b = 1) * 0 即 a = 2 + 1 * 0

请参考!
盜令玊 2008-01-25
  • 打赏
  • 举报
回复
以下是个人理解:
1)C#中不带有指针,所以,在做运算 a=b+(b=a)*0之前,保存b使用了两个寄存器.在运算过程中先是(b=a),b被重新赋值;接下来的运算a=b+(b=a)*0中(b=a)*0的运算结果是0,所以运算等价于a=b,而且这里的b是在运算前就已经被保存在寄存器中且没有被重新赋值的哪个b,在这里a被赋予了b的原始值.所以a,b的值被交换.
2)C中使用了指针,在运算 a=b+(b=a)*0之前,a,b的值保存到两个不同的寄存器地址,在运算的时候使用指针来取得寄存器中的值,因此运算了(b=a)后,保存b值的寄存器中的值已经被重写,在下面的运算a=b+(b=a)*0中,b的值已经被重新赋值,所以出现了a,b的值都是a的原始值的结果

以上仅为个人意见.
james_gosling 2008-01-17
  • 打赏
  • 举报
回复
我来给个正确答案好了 看大家这么热情
答案就是: 关电脑睡觉 散会了 散会了 ..................
ThanksGiveingDay 2008-01-16
  • 打赏
  • 举报
回复
哇噻!我的娘啊,我狂晕啊!写的还真的不错啊,可惜啊,本人学的不好,只看懂一点点,我真的要好好的学习学习了,趁现在还在学校,加油,我相信我也可以像楼上的一样,写的那样溜.....
加载更多回复(108)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧