第四章 表示式知識點專題及習題答案

2021-09-18 04:17:25 字數 2770 閱讀 1747

一、表示式的概念:表示式是由乙個或者多個運算物件組成,對表示式求值將得到乙個結果。

二、一元運算子:作用於乙個運算物件的運算子。例子:取位址符(&);解引用符(*)。

二元運算子:作用於兩個運算物件的運算子。例子:等號運算子(==);乘法運算子(是乙個星號)。

有些符號既可以作為一元運算子,也可以作為二元運算子。比如說(星號)既可以作為一元運算子「 解引用符 」,也可以作為二元運算子「 乘法運算子 」。

三、c++語言沒有明確規定大多數二元運算子的求職順序,給編譯器優化留下了餘地。這種策略實際上是在**生成效率和程式潛在缺陷之間進行了權衡,你認為這可以接受嗎?請說明你的理由。

復合表示式的處理:使用括號強制達到目的、重複改變可能會導致錯誤。

解析:這個是可以接受的,因為關鍵還是程式設計者自己對於程式的改寫。

四、寫出一條表示式用於確定乙個整數是奇數還是偶數。

#include using namespace std;

int main()

else

}

五、溢位的定義:當計算的結果超出了該型別所能表示的最大範圍時就會產生溢位。

六、解釋在下面的if語句中條件部分的判斷過程。

const char *cp="hello world";

if (cp &&*cp)

解析:cp是乙個指標,指向乙個字串,*cp是乙個字串

二者皆不為空,所以結果為真。

七、書寫一條表示式用於測試4個值a、b、c、d的關係,確保a大於b、b大於c、c大於d。

(a>b)&&(b>c)&&(c>d);
八、假設i,j和k是三個整數,說明表示式 i=j九、在下述語句中,當賦值完成後i和d的值分別是多少?

int i; double d;

(a) d = i = 3.5; (b) i= d = 3.5;

考察知識點:不同型別的賦值,肯定是需要強制型別轉換的。賦值運算子滿足**右結合律**。

解析:i=3 i=3

d=3.0 d=3.5

十、執行下述if語句後將發生什麼情況?

if (42 = i)   //.....

if (i = 42) //.....

知識點:需要注意的是:賦值和相等運算子的差異。

解析:第一條語句,將變數賦給常量,判斷肯定是假。第二條語句,將42賦給變數i,本身沒有問題,但是在此此處會檢驗賦值的結果是否為真,42非0,所以為真。

一、下面的賦值是非法的,為什麼?應該如何修改?

double dval; int ival; int *pi;

dval = ival = pi =0;

解析:0可以賦值給任何物件,這裡0隱式地轉換為null_ptr,此題錯在指標型別不能隱式地轉換為int整形型別。

修改為:dval = ival = *pi = 1;

二、儘管下面的語句合法,但他們實際執行的行為可能和預期並不一樣,為什麼?應該如何修改?

(a) if (p=getptr()!=0)       (b)if (i=1024)

解析:因為這裡的賦值語句被當作條件使用。應該修改為: if ((p=getptr())!=0) (b)if (i==10)

三、說明前置遞增運算子和後置遞增運算子的區別。

解析:前置遞增運算子:先算後用,後置遞增運算子:先用後算。

前置遞減運算子:先算後用,後置遞減運算子:先用後算。

四、假設ptr的型別是指向int的指標、vec的型別是vector、ival的型別是int,說明下面的表示式是何含義?如果有表示式不正確,為什麼?應該如何改正?

(a)ptr != 0 && *ptr++

(b) ival++ && ival

(c) vec [ival++] <= vec [ival]

解析:(a): (*ptr != 0) && (*ptr++) 判斷ptr指標指向的int值是否為0;

(b):判斷ival和ival+1兩個值是否都非0;

五、假設iter 的型別是vector::iterator,說明下面的表示式是否合法。如果合法,表示式的含義是什麼?如果不合法,錯在何處。

(a)*iter++;

(b)(*iter)++;

(c)*iter.empty()

(d)iter->empty();

(e)++*iter;

(f)iter++->empty();

知識點:首先介紹下點運算子,用於獲取類物件的乙個成員。點運算子與箭頭運算子之間的關係:ptr—>mem 與 (*ptr).mem 等價。

解析:

(a):合法:先對iter加1,再返回iter指向的值

(b):不合法:返回iter指向的值為string ++操作無意義

(c):不合法:iter是乙個指標,沒有empty()的成員

(d):合法:判斷iter所指向的值是否為空

(e):不合法:*iter可以得到iter所指的字串,但是字串並沒有++操作。

(f):合法:首先判斷iter所指向的值是否為空,再對iter加1

第四章知識點

繼承 滿足is a的關係,可以通過關鍵字extends來實現繼承.1.會繼承父類的屬性跟方法 不包括用private修飾的屬性和方法 2.繼承的關鍵字是 extends 3.被繼承的物件稱之為父類,繼承者稱之為子類 4.父類的構造方法只能被子類呼叫,不能被繼承 5.任何乙個類都有乙個預設的父類 ob...

第四章 表示式

左值,用的是物件的身份 記憶體中的位置 右值,用的是物件的值 解引用生成 左值,取位址生成乙個 右值 bool b true bool c b c為true,因為 bool值在計算的時候被轉換成整型號int,所以b被轉換成 1,不為0,所以賦值給c的時候,為true int b while b ge...

第四章 表示式

這個概念暫時很模糊,打算學完這一章再總結。目前的理解是,左值有名字,可以通過名字訪問記憶體,右值沒有名字,一般是運算的中間結果或者字面值常量等。const修飾的變數是常量左值 如果decltype 函式的括號中表示式結果是左值,則得到乙個引用型別。例如在下面這段 中,b是int型別,c是int 型別...