0. 表示式由運算子及其運算元組成
i++ ++ 是後自增運算子, i是它的運算元
i+=1 += 是求和賦值運算子, i和1都是它的運算元, i是左運算元, 1是右運算元
1. 左值和左值表示式
可以放在賦值運算子左側的運算元是左值
如果乙個表示式的計算結果是左值,那麼這個表示式是左值表示式
所以左值表示式也可以放在賦值運算子的左側
2.右值和右值表示式
右值不能放在賦值運算子左側
如果乙個表示式的計算結果是右值,那麼這個表示式是右值表示式
例如:1 數值常量, 字面值
'a' 字元常量, 字面值
"abc" 字串常量, 但做為乙個表示式, 它的值是這個字串在記憶體中的首位址
所以它實際是乙個唯讀指標(這個不是右值表示式, 是唯讀的左值表示式)
1+2 數值求和表示式, 結果是右值, 所以是個右值表示式
int i=1; i++ ; i++的結果是右值,所以是個右值表示式
(未經驗證
,是當前的猜測
:右值不在記憶體中存放, 是個"瞬間值",只出現在cpu暫存器中,所以沒有位址)
3.指標變數的宣告和它的"間接訪問表示式" (按首位址讀寫記憶體)
int a=1;
int *p_int=&a; 指標變數宣告,同時對指標變數賦初值
*p_int=3; 對"間接訪問表示式"賦值, *p_int是個表示式, 是個左值表示式
第二行和第三行的賦值表示式的形式相似,不易理解
第二行是對p_int這個變數進行賦值 (初始化, 因為這一行是變數宣告)
第三行是對 *p_int這個表示式賦值 (這裡出現了p_int這個變數,但不是對它賦值, 而是對整個表示式賦值)
3.1 在c語言中指標變數的乙個重要用法就是通過*運算子形成乙個"左值表示式"
再對整個"左值表示式"的計算結果(左值)進行賦值
3.2 "左值"就是記憶體中特定的一片位元組,這與第一篇中的觀點對應
(乙個變數就是記憶體中特定的一段連續的位元組,一段可以存入和讀出資料的記憶體位元組)
3.3 除了*外, 本質上也是間接訪問運算子, 乙個陣列變數的某個元素, 實質上是個表示式,乙個左值表示式
int a[3]=;
a[1]+=1; a[1]是個左值表示式(但a是唯讀指標變數),對它賦值, 就是對特定記憶體段寫入數值
6.關於i++和++i
i++
這個表示式的計算結果是
"自增前的i"
(注意, i++
是個右值表示式
, "後
++"會對
i的值加
1,但整個表示式的值是
i自增前的值)
++i
這個表示式的計算結果是
"自增前的
i"+1 (
注意, ++i
也是個右值表示式)
int a, i=1;
a=i++; //a=1
a=++i; //a=3
下面這兩行說法本身沒問題, 但會給我們以嚴重的誤導
i++是在使用
i這個變數
之後, 再對i進行自增運算
++i是在使用
i這個變數
之前, 先對i進行自增運算
a=i++;
按上面說法
,似乎是用i對
a賦值,這是錯誤的 在對
a賦值時
,並不使用i的值
, 而是使用
i++這個表示式的值
,也就是
i++這個表示式的計算結果
18-08-06 補充例子: ++作為字尾使用時, 會在所在表示式求值完成後, 再對運算數+=1。注意賦值表示式也是"表示式"
#include #include int main()
int i=2; i=i++;
以上兩個語句中第二個語句是賦值表示式語句, 其中有兩個表示式需要計算求值,
第乙個是i++, 表示式計算結果值為2,
所以第二個表式就是i=2, 這時i被賦值為2, 整個賦值表示式的值也是2, 至此計算求值完成
這時發生i+=1, 所以再引用i時, i==3
上例的最終輸出為:
啊哈c:
i=6, j=-40
7, 8
8
vc++6.0
i=6, j=-40
7, 7
8
tc7
i=6, j=-40
7, 6
8
從以上三個編譯器來看, vc++6.0, 函式引數是從左向右處理, tc7是從右向左處理, 並且都把函式呼叫做為表示式求值來處理, 也就是在函式呼叫(表示式求值)完成後, 再執行i+=1
只有啊哈c, 在函式呼叫完成前, 第二個引數傳值完成後, 就執行i+=1 //18-08-06補充
7. 陣列變數的概念還有些不清晰
int a=;
陣列變數是說a嗎? 不是, 陣列變數a應該是說存放這三個數的"特定的"的那片記憶體
那麼a是什麼?乙個可能, 是個唯讀型的指標變數,存放著這片記憶體的首位址(必須是唯讀,因為需要始終對應這個首位址)
a就只是乙個指標, 用於不同表示式, 會有不同的效果
表示式求值與字尾表示式
乙個算術表示式,含有數字 為簡化處理,數字只有一位 運算子 以及括號,求表示式的值。給出的表示式是一般我們見到的中綴表示式,即運算子位於運算元之間。如果把中綴表示式轉化為字尾表示式,那麼對字尾表示式求值將會很方便。字尾表示式特點 1.操作符位於運算元之後 2.沒有括號 3.運算子沒有優先順序。中綴表...
字首表示式 與 字尾表示式
在計算機程式設計中,我們使用字首或字尾表示式進行運算往往比中綴簡單 中綴表示式 1 2 3 4 5 字首表示式 1 2 3 4 5 字尾表示式 1 2 3 4 5 對於字首表示式 1 2 3 4 5,這裡的字首指的是運算符號字首,1 2 3 4 5 2 3 4 1 5可見連括號都省了。程式設計運算字...
計算字首表示式與字尾表示式
字首表示式 從後往前掃,遇到運算元入棧 遇到字元時取兩棧頂元素進行相應運算後結果入棧。字尾表示式 與上類似,只是是從前往後掃。求字首表示式的值 25 分 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 ...