1. 程式人生 > >關於順序點,副作用和賦值運算子的一點思考

關於順序點,副作用和賦值運算子的一點思考

《c primer plus》p104中講到:

副作用是對資料物件或檔案的修改

c的主要目的是對錶達式求值

c標準規定,在順序點,所有的副作用都在進入下一步前被計算(順序點是修改值的最晚時刻,有可能比它早)

 

3類順序點:

1.每個完整表示式結束後,即分號後面
2.&&,||,三木運算子(?:),以及逗號表示式的每一個運算物件計算之後
3.函式呼叫中對所有實際引數的求值完成之後(進入函式體之前)

 

b=a++;對於這一語句,先求a++這個子表示式的值,然後求(這個值賦給b)的值,遇到分號順序點,最遲在這裡完成a修改值和b修改值的操作。

int a=0;int b=(a=a++);這一語句執行後a的值是0,b也是0。個人理解:先把a的值賦給某一記憶體區域,然後求(這個區域賦值給a)這個表示式的值,注意只是求表示式的值,未必已經賦值,即修改左值,然後求這個表示式賦給b這個表示式的值,最後遇到分號,最遲在這裡3個副作用生效,既然最後a是0,那麼說明先a的值修改為1,然後那個記憶體區域存的原來的a賦給a,使得a還是0,然後賦表示式的值給b。注意,表示式語句的值是右值。

int a=0;a=(a++)+(a++);執行後a的值是1,個人理解過程:先考慮主要目的即表示式求值,再考慮副作用。先執行兩個a++,存到其他記憶體區域值均為0,賦給a這個表示式值為0,然後修改一次a,再完成賦值給a的動作,現在a是0,最後一次修改a為1.

int a=0;a=(a++)+(++a);執行後a的值是2,個人理解先執行++a,a為1,然後a++,1賦給某一區域,()+()的值是2但不賦給a,然後a修改+1為2,最後賦值給a2.

 

 

上c語言課時,老師講譚浩強書上的一個語句a+=a*=a-=a最後結果是0;感覺有問題,老師講的計算表示式時直接修改值,但實際上可能;時才修改值,但是結果確實是0,說明執行副作用是也是從右向左的。