天天看點

《編寫高品質代碼:改善c程式代碼的125個建議》——建議16-1:盡量使用複合指派運算符

本節書摘來自華章計算機《編寫高品質代碼:改善c程式代碼的125個建議》一書中的第2章,建議16-1,作者:馬 偉 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

c語言不但提供了最基本的指派運算符“=”,而且為了簡化程式并提高編譯效率,還允許在指派運算符“=”之前加上其他運算符,這樣就構成了複合指派運算符(即 /=、*=、%=、+=、-=、<<=、>>=、&=、^= 與 |= )。示例代碼如下:

對于表達式a/=b與a=a/b,有讀者會問,它們兩者之間究竟有什麼差別呢?

答案很簡單,對于a=a/b,a需要求值兩次;而對于a/=b,a僅需要求值一次。一般來說,這種差別對程式的運作沒有多大影響。編譯器一般會進行優化,使兩種表達式的運作效果

一樣。

當然,也有例外的情況,這時編譯器無法進行優化。當表達式作為函數的傳回值時,函數就會被調用兩次,例如:

a[f(x) + 1] += 1;

013f3763 mov eax,dword ptr [ebp-3ch]

013f3766 push eax

013f3767 call f (13f11dbh)

013f376c add esp,4

013f376f lea ecx,[ebp+eax*4-2ch]

013f3773 mov dword ptr [ebp-104h],ecx

013f3779 mov edx,dword ptr [ebp-104h]

013f377f mov eax,dword ptr [edx]

013f3781 add eax,1

013f3784 mov ecx,dword ptr [ebp-104h]

013f378a mov dword ptr [ecx],eax

013f378c mov eax,dword ptr [ebp-3ch]

013f378f push eax

013f3790 call f (13f11dbh)

013f3795 add esp,4

013f3798 mov esi,dword ptr [ebp+eax*4-2ch]

013f379c add esi,1

013f379f mov ecx,dword ptr [ebp-3ch]

013f37a2 push ecx

013f37a3 call f (13f11dbh)

013f37a8 add esp,4

013f37ab mov dword ptr [ebp+eax*4-2ch],esi

繼續閱讀