一、表示式的概念:表示式是由乙個或者多個運算物件組成,對表示式求值將得到乙個結果。
二、一元運算子:作用於乙個運算物件的運算子。例子:取位址符(&);解引用符(*)。
二元運算子:作用於兩個運算物件的運算子。例子:等號運算子(==);乘法運算子(是乙個星號)。
有些符號既可以作為一元運算子,也可以作為二元運算子。比如說(星號)既可以作為一元運算子「 解引用符 」,也可以作為二元運算子「 乘法運算子 」。
三、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 型別...