c++简单小问题
答案:2 悬赏:50 手机版
解决时间 2021-11-09 02:02
- 提问者网友:骨子里的高雅
- 2021-11-08 12:55
c++简单小问题
最佳答案
- 五星知识达人网友:摆渡翁
- 2021-11-08 13:33
=号返回左值引用,多个=号执行顺序是从右至左依次执行,而括号永远最先执行。据此,25行的解析过程是:
追问老铁,你搞错了吧,3. 执行qsd[j]=qsd[j]-qsd[i] ->此时qsd[j]=20,qsd[i]=15; -> so->最后qsd[j]=5.没什么问题吧。
而且你看,我前一行用a,b带的就没问题啊,我是先写好a,b的式子,再把qsd的带进去的,然后竟然出错了,我也很绝望啊追答第3步即最外层括号是一个UB操作,取决于解引用符和括号的执行先后顺序,qsd[j]先入或是后入寄存器将导致不同的结果,如果是先入寄存器则第3步执行的是qsd[j]=15-qsd[i]=15-15=0。如果是取即时值则第3步执行的是qsd[j]=qsd[j]-qsd[i]=20-15=5。而单纯的变量a和b不存在这个问题,因为它们不需要解引用。如果你对这个问题背后的原理感兴趣并且能看懂汇编代码,我可以给你详细地讲解这个问题的原因。
在实际的编程中应该避免这样的UB操作,因为它依赖于编译器的行为。如果你想用一行代码交换两个整型变量,可用异或操作:{a=a^b;b=a^b;a=a^b;},而且这种方法不会导致溢出问题。
- 执行qsd[j]=qsd[i]+qsd[j],返回qsd[j]的引用5+15=20
执行qsd[i]=qsd[j]-qsd[i],返回qsd[i]的引用20-5=15
执行qsd[j]=qsd[j]-qsd[i],返回qsd[j]的引用15-15=0
追问老铁,你搞错了吧,3. 执行qsd[j]=qsd[j]-qsd[i] ->此时qsd[j]=20,qsd[i]=15; -> so->最后qsd[j]=5.没什么问题吧。
而且你看,我前一行用a,b带的就没问题啊,我是先写好a,b的式子,再把qsd的带进去的,然后竟然出错了,我也很绝望啊追答第3步即最外层括号是一个UB操作,取决于解引用符和括号的执行先后顺序,qsd[j]先入或是后入寄存器将导致不同的结果,如果是先入寄存器则第3步执行的是qsd[j]=15-qsd[i]=15-15=0。如果是取即时值则第3步执行的是qsd[j]=qsd[j]-qsd[i]=20-15=5。而单纯的变量a和b不存在这个问题,因为它们不需要解引用。如果你对这个问题背后的原理感兴趣并且能看懂汇编代码,我可以给你详细地讲解这个问题的原因。
在实际的编程中应该避免这样的UB操作,因为它依赖于编译器的行为。如果你想用一行代码交换两个整型变量,可用异或操作:{a=a^b;b=a^b;a=a^b;},而且这种方法不会导致溢出问题。
全部回答
- 1楼网友:轮獄道
- 2021-11-08 14:04
这个还叫做简单吗追问啊?不是很简单吗
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯