表示式求值計算

2021-07-09 08:49:32 字數 1901 閱讀 9564

在c語言中,表示式由運算子、常量及變數構成。每乙個表示式,都有對應的乙個值。 該值與表示式中操作符的優先順序和結合律有關。表示式求值,也會經常出現在名企求職的筆試試題裡。

1.位運算表示式求值

位運算表示式求值,需要掌握位運算的定義和整數十進位製到二進位制之間的轉化方法。 (具體請參考:

進製轉化

) 題目:試著計算如下表示式的值(某安全名企面試筆試題目):

1)15&240

2)10^12

3)(char)(127<<1)+1

4)(char)(-1>>1)+1

5)1<<2+3

解答: 

1)15&240=00001111 & 11110000=0

2)10^12=1010^1100=0110=6

3)(char)(127<<1)+1=(01111111<<1)+1=11111110+1=11111111=-1

4)(char)(-1>>1)+1=(11111111>>1)+1=11111111+1=0

5) 1<<2+3=1<<(2+3)=1<<5=2^5=32(注意《和+的優先順序)

2.i++與++i求值

i++與++i是最經典的一類表示式求職題目。大家知道,在表示式裡,i++是先取得i的值,再增加1;而++i是先將i的值加1,再取i的值。 如果i++和++i單獨形成表示式,那麼對於內建型別(如int,long等)2者之間沒有任何區別。

i++;

++i;

在c++裡,++i的效率要比i++的高一些。具體原因請參考

i++與++i

當然,如果是將i++和++i放在賦值表示式裡,比如:

int i = 10;

int a = i++;//此時,i先將10賦值給a,然後再加1得11。

printf("a=%d,i=%d\n", a,i);//所以此處輸出為10,11

i = 10;

a = ++i;//此時,i先加1得11,再將11賦值給a

printf("a=%d, i=%d\n", a,i);//所以此處輸出為11,11

或者將i++和++i放到函式引數裡,比如:

void func(int i)

int i = 10;

func(i++);//此時,i先將10傳遞給函式func,然後再加1,所以函式內部列印為10

i=10;

func(++i);//此時,i先加1得11,再將11傳遞給函式func,所以函式內部列印為11

3.逗號表示式求值

逗號表示式是用逗號運算子將表示式連線在一起形成新的表示式。逗號表示式的格式為:

表示式1,表示式2,…,表示式n

逗號表示式的計算順序是從左往右,逗號表示式最終的值是表示式n的值,即表示式最右邊的值為逗號表示式的值。

在計算逗號表示式的值的時候,一定要注意,逗號運算子的優先順序是最低的運算子,所以逗號運算子是最後參加運算的。比如考慮如下程式的輸出是什麼呢? 

int main(void)

首先,由於逗號運算子的優先順序最低,所以也就低於賦值運算子,所以表示式:

c=a++,b++,++b

等價於:

(c=a++),b++,++b

等價於:

(c=a; a++),b++,++b

其結果為:

c=1, a=2, b= 3

所以輸出應該是:2,3,1。而整個逗號表示式的值為3。

int main(void)

由於賦值運算子優先順序高於逗號運算子,所以,應該先算x=a+b,即x=6,再算y=(x=6), 即y也等於6,再算b+c,即10,所以z=(6,10),所以,z=10。於是輸出為:y=6,x=6,z=10

思考題試分析如下程式執行的結果:

int i = 10;

printf("%d,%d,%d,%d\n", i++,++i,i--,--i);

表示式求值

程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...

表示式求值

既然是表示式求值,自然需要在記憶體中儲存計算結果以及中間值。在 用c語言寫直譯器 一 中提過 變數要求是若型別,而 c 語言中的 view plaincopy to clipboardprint?in basic io.h define memery size 26 typedef enum var...

表示式求值

寫了乙個下午,各種糾結,各種問,終於搞明白了。但是自己還是想出來的一點東西的。很爽歪歪的,哈哈。先貼第一次的 include include include include include includeusing namespace std char data 7 7 int sign char ...