關於左值和右值的一些問題總結
在C語言當中,我們經常會遇見一些平時感覺怎麼用都不會出錯的小知識點,但是再將它的難度提高一點點的時候,或者將它改變一點點,我們就不再將它用起來那麼的得心應手。左值和右值正是一個這樣的十足十的例子。在學習了指標知識之後,高度理解左值與右值便不再顯得那麼的無聊。
這個解釋看起來有點傻,但是不得不說:
左值就是那些能夠出現在賦值符號左邊的東西,右值就是那些能夠出現在賦值符號右邊的東西。
例如:a=b+25;
這裡,a是左值,它標識了一個可以儲存結果值的點,也就是說,他有一個可以自己掌控的固定的空間,b+25是右值,因為他指定了一個值。
那麼他們可以互換嗎?
例如:b+25=a;
答案當然是不可以;
注意,當計算機計算b+25時它的結果必然儲存在機器的某個地方。但是程式設計師並沒有辦法預測該結果會儲存在什麼地方,也無法保證下一次這個表示式的值仍然會存在原來的那個地放。其結果就是b+25不能當左值。因為他沒有固定的標識一個點。
但是a可以作為一個右值,因為每個位置都包括了一個值。
所以總結了來看:
左值:我們主要用他的空間 ;
右值:我們主要用他的值。
字面值常量都不能為左值。
為了鞏固上面的所學理論,也為了讓我們更加的瞭解怎麼回事,我們現在開始將下面的例子深入討論:
當有程式碼:
char ch=‘a’;
char *cp=&ch;
那我們來看看下面的程式碼是什麼意思?能否做左值?能否做右值?
&ch; //&ch是地址常量,只能做左值,不能做右值;
cp; //cp是一個變數,既有儲存空間,又有值,所以左值和右值都可以做;
&cp; //&cp是地址常量,只能做右值,不能做左值。
*cp+1; //它的運算順序是,現將cp解引用,再將cp的值加1,所以是一個常量(在本題中,他表示給a+1,也就是字元b),只能做右值,不能左值;
*(cp+1); //這裡的運算表示ch之後的一塊空間(讀取cp下一個空間的內容),既可以做左值,又可以做右值;
++cp; //這裡表示給ch的地址加1,也就是給地址常量加1,可以做右值,不可以做左值;
cp++; //理由與++cp的理由相同;
*++cp; //先自加,在解引用,表示了ch的下一個空間(讀取下一個空間的內容),既可以做左值,又可以做右值;
*cp++; //理由同上;
(*cp)++; //表示將ch的地址加1,是一個常量,不可以做左值,但是可以做右值;
++*++cp; //表示對ch下一塊空間地址的前置++,是一個常量,不可以做左值,但是可以做右值;
++*cp++; // 表示對ch的空間地址先前置++,在後置++,是一個常量,不能做左值,但是可以做右值。
好了,先到這裡吧