为了账号安全,请及时绑定邮箱和手机立即绑定

C语言中*s++ = *t++ 是怎么一种赋值过程

C语言中*s++ = *t++ 是怎么一种赋值过程

慕莱坞森 2019-03-30 11:31:05
如题K&R中的一个strcpy函数中出现的方式voidstrcpy(char*s,char*t){   while(*s++=*t++);}
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

首先是
*s=*t;
然后判断整个表达式的值是否为真,即
*s!=0
满足,则继续循环,否则终止
不论循环继续与否,接下来要执行
s+=1;t+=1;//s先自增还是t先自增在这里是无关紧要的
=================================
回答评论中补充的问题,程序怎么读
优先级表我就不贴了,百度一大堆,核心是你要理解下面流程中的5.2
编译器解析到*,判断为指针运算符号,需要一个标示符或者表达式
解析到s,是一个合法的标示符,继续搜索是否有更高优先级的运算符
继续解析到++,由于*与++是同一优先级,结合性为右到左,所以等同于*(s++)
然后是=,判断为赋值运算符,优先级比++低,因此前面的部分可以直接进行计算
那么*(s++)怎么计算?
拆解成expr1=s++;expr2=*expr1;
首先是expr1=s++,后置++的含义是先使用变量/表达式的值、再自增,表达式s++的计算结果就是s的值,计算完毕后,s自增1,也就是说假如s=1,那么s++这个表达式的计算结果就是1,expr1=1,计算完毕后,s的值自增1变为2,但不影响之前已经计算完毕的表达式
然后计算expr2=*expr1,按照上面所举的例子,此时s=2,expr2=*1
然后继续=的计算,由于赋值运算符是双目运算,需要一个右目表达式,继续解析
后面*的优先级比=高,因此先计算*t++,原理同上
然后计算赋值表达式的值,没错!赋值表达式也是表达式,它也有计算结果,它的计算结果就是右边表达式计算结果,表达式a=b的值就是b
计算完毕后,执行while的功能,判断表达式计算结果是否为真,也就是是否非0
                            
查看完整回答
反对 回复 2019-03-30
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

voidv(char*s,char*t){
*s++=*t++;
}
看一下对应指令
push%rbp
mov%rsp,%rbp
mov%rdi,-0x8(%rbp)//参数1s
mov%rsi,-0x10(%rbp)//参数2t
mov-0x10(%rbp),%rax//t暂存%rax
movzbl(%rax),%edx//*t放入%edx
mov-0x8(%rbp),%rax//s暂存%rax
mov%dl,(%rax)//*t的低8位,即一个字节,放入*s
addq$0x1,-0x8(%rbp)//s++
addq$0x1,-0x10(%rbp)//t++
leaveq
retq
可以看到,先*s=*t,然后s和t各自加1
                            
查看完整回答
反对 回复 2019-03-30
  • 2 回答
  • 0 关注
  • 1305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号