社区
C#
帖子详情
a=b+(b=a)*0是如何编译
pengdean
2007-09-29 01:14:12
加精
我在torboc 在运行该等式是交换a,b值,但不知道为什会这样。请高手指点下。该等式是怎样一步一步运行。在turboc 此等式一步就运行玩。分开运行就会是不同的结果
...全文
3808
130
打赏
收藏
a=b+(b=a)*0是如何编译
我在torboc 在运行该等式是交换a,b值,但不知道为什会这样。请高手指点下。该等式是怎样一步一步运行。在turboc 此等式一步就运行玩。分开运行就会是不同的结果
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
b = a += a -= a *= a++及c = b *= b += b += --b运算解析
. java 对于基本数据类型的赋值是很简单的,基本数据存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到另外一个地方。
a=a+b和a+=b的区别
1、对于同样类型的a,b来说 两个式子执行的结果确实没有什么区别。但是从
编译
的角度看吧(武让说的),a+=b;执行的时候效率高。 2、对于不同类型的a,b来说 2.1 不同类型的两个变量在进行运算的时候,我们经常说到的是类型的转换问题。这里,记住两点:一、运算过程中,低精度的类型向高精度类型转换。二、如果将高精度的数值赋值给低精度类型变量,则必须要进行显性的强制转换。 2.2 对于a+=b;这个式子,要明确的一点是,+=运算中,结合了强制类型转换的功能,因此,不会出现
编译
错误;而对于a=a+b;
符合c语言语法规定的是,若变量已正确定义并赋值,符合C语言语法的表达式是 A。a=a+7; B.a=7+b+c,a++...
题目:若变量已正确定义并赋值,符合C语言语法的表达式是() A。a=a+7; B.a=7+b+c,a++若变量已正确定义并赋值,符合C语言语法的表达式是()A。a=a+7;B.a=7+b+c,a++C.int(12.3%4)D.a=a+7=c+b要解释,谢谢解答:以下详细解析.A:正确B:a=7+b+c,a++;在
编译
器看来这句代码是可以通过
编译
的,但是!逗号表达式的值是最后一个表达式的值,也就是...
python中a* b是什么意思_python的 a,b=b,a+b 和 a=b b=a+b 的区别
区别就是:赋值运算,先计算赋值号(也就是=号左边的,再赋值)1、a, b = b, a+b 这种赋值先计算等值 右边 就是 b=1 a+b=1再赋值给a和b,那么 a=1, b=12、a = b b = a+b此时 b=1, 那么a=1 那么最后 b=2a, b = b, a+b 这个表达式的意思就是说,先计算=号的右边b的值,a+b的值,算好了,然后再分别赋值给a 和b就可以了。扩展资料:Pyt...
C++中a += b和a = a + b的区别
从效率上看 a += b直接在a中加了b; a = a + b则是用一个临时变量temp记录a的值,类似过程: temp = a; temp +=b; a = temp; 多了一次2次拷贝。 注意,当a是整数时,效率相差的可能不是很明显,但是当a是字符串的时候,多了两次字符串拷贝对效率的影响是非常大的。 从
编译
角度看 对于不同类型的a,b来说 1 不同类型的两个变量在进行运算的时候,我们经常说到的是类型的转换问题。这里,记住两点:一、运算过程中,低精度的类型向高精度类型转换。二、如果...
C#
110,533
社区成员
642,574
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章