天天看點

帶你讀《C語言程式設計習題解析與上機指導》之三:資料類型、運算符與表達式第3章資料類型、運算符與表達式

點選檢視第一章 點選檢視第二章

第3章資料類型、運算符與表達式

3.1本章知識重點

1)C語言的基本詞彙表和關于辨別符的規定。

2)變量和常量:在程式運作過程中其值可以改變的量稱為變量。變量具有資料類型、變量名、變量值和存儲類型四個屬性。變量在其存在期間,在記憶體中按照定義的類型占據不同長度的存儲單元,并可以用來多次存放不同的數值。在程式運作過程中其值不能改變的量稱為常量,其類型是由本身隐含的類型決定的。

3)轉義字元:轉義字元是一種特殊的字元常量,C語言約定以“”開頭作為标記的字元序列為“轉義字元”,學習中需要記住幾個常用的轉義字元。

4)字元常量和字元串常量的差別:字元常量與其對應的ASCII碼等價,用單引号表示。字元串常量中的字元依次存儲在記憶體中一塊連續的區域内,并把空字元'0' (ASCII值為0)自動地附加到字元串的尾部作為字元串的結束标志,用雙引号表示。

5)C語言中的資料類型:不同資料類型的資料具有不同的類型說明符,在記憶體中具有不同存儲長度以及不同的取值範圍和允許的操作。

6)運算符:C語言中的運算符不單單是我們通常認為的進行數學運算的符号,而是具有更加廣泛的含義。C語言将描述各種操作的符号通稱為運算符,除了控制語句和輸入、輸出以外的幾乎所有基本操作都用運算符處理,是以有些文獻中将其稱為“操作符”。運算符具有兩個屬性:優先級和結合性(結合方向)。

7)表達式:用運算符将被操作對象連接配接起來,符合C語言文法的式子稱為表達式。表達式的值也可以說是表達式的運算結果,所有表達式的值隻有兩類:數值和位址。

8)表達式求值的文法規則:當若幹個不同優先級的運算符同時出現在表達式中時,運算符的優先級規定了運算的先後次序。當若幹個具有相同優先級的運算符相鄰出現在表達式中時,結合方向規定了運算的先後次序。一般來說,大多數運算符的結合方向為“從左到右”,隻有單目運算符、指派運算符和條件運算符的結合方向為“從右到左”。

9)幾種表達式求值需要注意的問題:

  • 算術表達式:應注意在除法運算中,兩個整數相除的結果為整數。取餘運算隻能作用于兩個整型數,并且規定運算結果的正負符号與被除數的符号一緻。
  • 指派表達式:指派運算符的優先級很低,僅高于逗号運算符。結合方向為“從右到左”,注意在運算中将右邊表達式值的類型無條件地轉換為左邊變量的類型。要了解複合指派運算符的含義,并學會正确的使用方法。
  • 逗号表達式:逗号運算符的優先級最低,逗号表達式的值和類型就是最右邊的表達式的值和類型。
  • 自增運算和自減運算:自增運算和自減運算實質上是對于算術運算和變量指派運算兩種運算的結合。注意“++變量”或“變量++”出現在表達式中時求值的時機不同。

3.2習題解析

3.2.1計算題

設變量定義如下:

char a='a'; int i=3,j=5,b;  
float x=2.5; double y=5.0, z;           

計算下面表達式的值。

  1. y+=i-=j*=++x;

【答案】 -9.0

【解析】 表達式中出現三個複合指派運算符和一個自增運算符,因為自增運算符優先級最高,先計算++x,然後再從右向左依次計算。

1)計算++x:結果x值為3.5。

2)計算j=++x相當于計算j=j3.5:先計算j*3.5值為17.5,将17.5賦予整型變量j,再做j=17.5,C文法規定以指派表達式左邊的變量類型作為表達式值的類型,結果j值為17。

3)計算i-=j*=++x相當于計算i=i-17,i=3-17,結果i值為-14。

4)計算y+=i-=j*=++x相當于計算y=y+(-14),y=5.0-14,結果y值為-9.0,表達式的值為-9.0。

  1. a=a+i, a+j

【答案】 105

【解析】 題中優先級最低的運算符是逗号運算符,是以是一個逗号表達式,從左向右依次計算每一個表達式,逗号表達式的值和類型就是最右邊的表達式的值和類型。

1)計算a=a+i,結果a='a'+3, 變量a值為'd'。

2)計算a+j相當于計算'd'+5或者100+5('d'的ASCII碼為100),因為變量a為字元型,變量j為整型,根據“類型向高轉換”的規則,表達式a+j的運算結果為整型105。

3)表達式a+j的值為105,變量a值為'd'。

  1. a=(a+=i++, a+i)

【答案】 'h'

【解析】 括号運算符優先級最高,應先計算括号中的逗号表達式,再将該逗号表達式的值賦予變量a。

1)計算表達式i++,因為該表達式此時沒有參與運算,是以暫不求值,變量i仍然等于3。

2)計算a+=i++相當于計算a=a+i,a='a'+3或者a=97+3('a'的ASCII碼為97),因為變量a為字元型,表達式a=a+i的運算結果為變量a(等于'd')。

3)對表達式i++求值,相當于計算i=i+1,變量i等于4。

4)計算a+i相當于計算'd'+4:根據“類型向高轉換”的規則,表達式a+i的運算結果為整型104。括号中的逗号表達式結果為整型104。

5)将104賦予變量a,表達式的值為'h',變量a值為'h'('h'的ASCII碼為104)。

  1. (int)y% i %(int)(x+y)

【答案】 2

【解析】 該表達式做兩次取餘運算,是算術表達式。因為取餘運算隻能作用于兩個整型數,是以首先需要對非整型表達式的值進行強制類型轉換。

1)對變量y的值強制類型轉換為整型,結果為5。

2)計算5% i相當于計算5%3,結果為2。

3)計算(int)(x+y),将表達式x+y的值7.5強制類型轉換為整型,結果為7。

4)計算2%7,表達式的值為2。

  1. i+++j

【答案】 8

【解析】 該表達式形式上有三個加号,可以分解為一個自增運算符和一個加法運算符,是一個算術表達式。從左向右開始計算,首先将自增運算符和變量i結合,然後将i++的結果和變量j相加。可以将表達式等價表示為(i++)+j。

1)計算表達式i++,因為該表達式此時沒有參與運算,變量i仍然等于3。

2)計算3+j相當于計算3+5,運算結果為8,表達式的值為8。

3)對表達式i++求值,相當于計算i=i+1,變量i等于4。

3.2.2選擇題

  1. 下面轉義字元中,錯誤的是(  )。

    A. ' 0xa5 ' B. ' 031 ' C. ' b ' D. ' " '

【答案】 A

【解析】 C語言中有一些特殊的字元,約定以“”開頭作為标記,這類字元統稱為“轉義字元”,從字面上了解就是将反斜杠“”後面的字元轉換成另外的意義,用于代表一種特定的控制功能或表示一個特别的字元。

本題中,轉義字元' 031 ' 表示八進制所代表的字元。轉義字元' b '表示倒退操作,将目前位置移到前一列。轉義字元' " ' 表示雙撇号字元,而字元' ' 加1到2位十六進制數表示與該十六進制數對應的ASCII碼所代表的字元。' 0xa5 '有4位十六進制數,不符合要求,如果去掉字元“”,' 0xa5 '表示一個十六進制數整型常量。

  1. 字元串"\\1234\\n"在記憶體中占(  )位元組。

    A. 14 B. 9 C. 10 D. 11

【答案】 C

【解析】 字元串常量中的字元依次存儲在記憶體中一塊連續的區域内,并把空字元'0' (ASCII 值為0)自動地附加到字元串的尾部作為字元串的結束标志。每個轉義字元和其他字元一樣,在記憶體中占1個位元組。是以,對于字元個數為n的字元串,所占記憶體空間應為n+1個位元組。

首先計算字元串中一共有多少個字元,注意不要簡單地數字元的個數,當遇到字元''時,應該考慮轉義字元的判别。“\”為一個轉義字元,該字元串中共有4個轉義字元,'n'也是一個轉義字元。除此之外,還有4個普通字元'1'、'2'、'3'、'4'。另外,字元串的結束标志'0'也占1個位元組,是以該字元串在記憶體中占位元組數為4+1+4+1=10。如果該題改為求字元串的長度,答案應該是9。

  1. 已知梯形的上底為a,下底為b,高為h,用C語言書寫的正确的面積公式為(  )。

    A. 1/2(a+b)h B. 1.0/2(a+b)h C. 1.0/2.0(a+b)h D. 1.02a+bh

【答案】 B

【解析】 A項1/2(a+b)h中的1/2由于是兩個整數相除,結果為整數0,導緻整個表達式的計算結果為0。

B項1.0/2(a+b)h中的1.0/2由于是浮點數和整數相除,結果為浮點數0.5,修改了A項的錯誤,是一個符合C語言文法的正确算術表達式。

C項1.0/2.0(a+b)h中的兩項相乘應該用算術運算符''連接配接,這種寫法在一般數學代數運算中使用,但不符合C語言文法,可以改為1.0/2.0(a+b)*h。

D項1.02a+bh的文法沒有問題,但根據算術運算符的優先級計算出的結果不是梯形的面積。

  1. 與k=n++完全等價的表達式是(  )。

    A. n=n+1, k=n B. k+=n+1 C. k=++n D. k=n, n=n+1

【答案】 D

【解析】 表達式k=n++的計算步驟是:

1)按照運算符的優先級,先計算表達式n++,相當于計算k=n++, 因為該表達式是後置自增運算,是以暫不求值。

2)計算k=n++, 相當于先計算k=n。

3)再對表達式n++求值,相當于計算n=n+1。

D項是正确的,B項可改寫為k=k+(n+1), C項相當于n=n+1, k=n,與A項相同。

  1. 設變量定義如下:
  2. i=8, k, a, b;

double x=1.42,y=5.2;

則以下符合C語言文法的表達式是(  )。

A. a=a3=2 B. a+=a-=(b=4)(a=3) C. y=float(i) D. x%(-3)

【解析】 A項表達式a=a3=2首先将2賦予a3,由于指派表達式左邊必須是變量,不能是表達式,是以這是錯誤的寫法。C項表達式y=float(i)的表示方法不正确,應該寫成y=(float)i。D項表達式x%(-3)中的變量x是雙精度實型,不可以進行取餘運算。

  1. 假定變量定義如下:
  2. k=7,x=12;

則以下能使值為3的表達式是(  )。

A. x%=(k%=5) B. x%=(k-k%5) C. (x%=k)-(k%=5) D. x%=k-k%5

【解析】

A項 x%=(k%=5) 的計算過程:x=x%(k=7%5)→ x=x%(k=2)→ x=12%2→x=0。

B項 x%=(k-k%5) 的計算過程:x=x% (k-k%5)→ x=12% (7-7%5) →x=12% (7-2) → x=12%5→x=2。

C項 (x%=k)-(k%=5) 相當于(x=x%k)-(k=k%5),計算過程: (x=5)-(k=2)→5-2→3。

D項 x%=k-k%5 相當于x=x% (k-k%5),結果同B。

  1. 下列關于自增運算符++和自減運算符--的叙述中,正确的是(  )。

    A. 它們的運算對象可以是任意變量和常量。

B. 它們的運算對象可以是char型變量和 int型變量,但不能是float型變量。

C. 它們的運算對象可以是int型變量,但不能是double型變量和float型變量。

D. 它們的運算對象可以是char型變量、int型變量和float型變量。

【解析】 自增運算符++和自減運算符--隻能用于變量,不能用于常量和表達式,但對變量的類型沒有限定。

繼續閱讀