【1】(Page171)switch-case問題
對於switch-case,普遍的誤解是:只有與被匹配的case標籤相關聯的語句才被執行。實際上,程式從該點開始執行並繼續越過case邊界直到switch語句結束。例如,下面記錄母音字母個數的switch程式的實現就是不正確的:
#include "stdafx.h"#include <iostream>#include "stdlib.h"using namespace std;int main(){cout<<"請輸入字串:"<<endl;char str[100];char *ch=str;cin>>ch;cout<<"輸入的字串是:"<<ch<<endl;int acnt=0,ecnt=0,icnt=0,ocnt=0,ucnt=0;while(*ch){switch(*ch){case 'a':++acnt;case 'e':++ecnt;case 'i':++icnt;case 'o':++ocnt;case 'u':++ucnt;}++ch;}cout<<"Number of vomel a:\t"<<acnt<<'\n'<<"Number of vomel e:\t"<<ecnt<<'\n'<<"Number of vomel i:\t"<<icnt<<'\n'<<"Number of vomel o:\t"<<ocnt<<'\n'<<"Number of vomel u:\t"<<ucnt<<'\n';system("pause");}
如果ch被設定為i,則程式從case 'i'後面的語句開始執行,icnt遞增。但是,程式的執行並沒有在那裡停止,而是越過case邊界繼續執行,直到switch語句的結束花括弧。ocnt和ucnt也都被遞增。
資料測試:
【2】(Page178)for迴圈
for迴圈的文法形式:for(init-statement;condition;expression)statement;
在init-statement中可以定義多個對象,但只能出現一個聲明語句。因此,所有對象都必須是相同的類型。
【3】(page182)do-while迴圈的條件不支援對象定義。即:不能寫
do{numble(foo);}while(int foo=get_foo())//錯誤
因為只有在語句或語句塊被執行後,條件部分才被計算。
【4】(Page220)我們能夠定義的容器的類型有三個限制(實際上,它們只適用於使用者定義的類類型)
1、元素類型必須支援等於操作符
2、元素類型必須支援小於操作符(其他關係操作符都是用這兩個來實現的)
3、元素類型必須支援一個和預設值
【5】(Page278)被調用函數(inline函數與非inline函數)的函數體展開的時間
函數調用會導致兩件事情發生。如果函數已經被聲明為inline(內聯),則函數體可能已經在編譯期間它的調用點上就被展開。如果沒有被聲明為inline,則函數在運行時才被調用。
【6】(Page286)指標引用
我們可以聲明任意內建資料類型的引用參數。例如,如果程式員想修改指標本身,而不是指標引用的對象,則可聲明一個參數,該參數是指標的引用。例如,下面是交換兩個指標的函數:
void ptrswap(int *&v1,int *&v2){ int *tmp = v2; v2 = v1; v1 = tmp;}
如下聲明:
int *&v1;
應該從右往左讀:v1是一個引用,它引用一個指標,指標指向int型的對象。
執行個體:
int main(){int i = 10;int j = 20;int *pi = &i;int *pj = &j;cout<<"before ptrswap():\t pi:"<<*pi<<"\t pj:"<<*pj<<endl;ptrswap(pi,pj);cout<<"after ptrswap():\t pi:"<<*pi<<"\t pj:"<<*pj<<endl;}
運輸結果:
【7】(Page290)把參數聲明為數組的引用
//參數為10個int的數組void putValues(int (&arr)[10]);int main{int i,j[2];putValues(i);//錯誤:參數不是10個int的數組putValues(j);//錯誤:參數不是10個int的數組return 0;}
當參數是一個數群組類型的引用時,數組長度成為參數和實參類型的一部分,編譯器檢查數組實參的長度與在函數參數類型中指定的長度是否匹配。
【8】(Page291)函數參數為二二維數組
這樣的參數必須指明第一維以外的所有維德長度。例如:
void putValues(int matrix[][10],int rowSize);
matrix可以等價地被聲明為:
int (*matrix)[10];
matrix的類型是指向10個int的數組的指標。如同只有一維的數組參數一樣,多維陣列的第一維與參數類型與參數類型無關。多維陣列的參數類型檢查只檢查多維陣列實參中除了第一維之外的所有維德長度與參數是否相同。
*matrix周圍的括弧是必須得。因為下標優先順序高。下列聲明:
int *matrix[10];
將matrix聲明成一個含有10個指向int的指標的數組。
【9】(Page317)關於函數指標
只有當賦值操作符左邊指標的參數表和傳回型別與右邊函數或指標的參數表和傳回型別完全符合時,初始化和賦值才是正確的。如果不匹配,則將產生編譯錯誤資訊。在指向函數類型的指標之間不存在隱式轉換。
【10】(Page327)名字解析順序
局部域內的名字解析由內向外~~~,所以在外圍域中的生命被潛逃與中的同名聲明所隱藏~
【11】(345)動態分配的數組的初始化問題
一般的,在空閑儲存區上分配的數組不能給出初始化值集。
int *pia = new int[1024];
我們不能在這個運算式中通過指定初試值來初始化數組的元素。它必須在for迴圈中被初始化。
for(int i = 0;i < 1024;i++){pia[i] = 0;}
【12】(Page346)數組的動態分配
new 運算式分配的數組的維數可被指定為一個在運行時刻才被計算出來的值,如下所示:
#include <cstring>const char* errorTxt;if(errorFound)errorTxt = err189;elseerrorTxt = noerr;//err189和noerr都是字串常量int dimension = strlen(errorTxt) + 1;//注意!strcpy(str1,errorTxt);
對strlen()傳回值加一是必須的。這樣才能容納C風格字串的結尾Null 字元。不然會出現錯誤,而且很難被跟蹤。因為大多數處理C分割字串數組的常式都要遍曆數組直到結尾Null 字元。使用C++標準庫string可以避免此類錯誤。
注意,對於用new運算式分配的數組,只有第一維可以用運行時刻計算的運算式來指定。其他維必須是在編譯時間刻已知的常量值。
int getDim();int (*pia3)[1024] = new int[getDim()][1024];//OKint **pia4 = new int[4][getDim()];//錯誤,數組的第二維不是常量
【13】(Page346)const對象必須被初始化,否則會產生編譯錯誤。