亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C語言中*s++ = *t++ 是怎么一種賦值過程

C語言中*s++ = *t++ 是怎么一種賦值過程

蝴蝶不菲 2019-04-16 20:27:47
如題K&R中的一個strcpy函數中出現的方式voidstrcpy(char*s,char*t){???while(*s++=*t++);}
查看完整描述

2 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超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-04-16
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

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-04-16
  • 2 回答
  • 0 關注
  • 478 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號