記憶體 變數 指標 三 表示式與自增字尾運算

2021-06-22 07:04:58 字數 2924 閱讀 3745

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 ...