第六章
在switch
中只有在最後乙個
case
或是default
語句之後才能定義變數,之所以這樣規定是為了避免**跳過變數定義和初始化。
如switch(val)
為了解決這種情況,可以為每個case
語句新增
{}花括號,引入塊語句,在該塊定義的變數只能在該語句塊中使用。
對於do while
迴圈do
while(int foo==val());
此句是錯誤的。
也不可以以下情況do後
foo就不復存在了。
}while(foo==val)
令人不可思議的是在交換機和路由器這些長時間執行的互動式系統90%
的**用於實現錯誤檢測和錯誤處理。想想自己寫過的**要麼沒有錯誤檢測和處理,要麼僅有簡單的錯誤檢測。無地自容吶。異常處理學了很長時間,竟然在實際開發沒有使用過,這是不應該的,這一次一定得從這上面下功夫。
異常機制提供程式的錯誤檢測與錯誤處理部分之間的通訊。有標準庫定義的一組異常類用來在throw
和catch
之間傳遞有關的錯誤資訊。
try引入區域性作用域,在
{}定義的變數不能再
try塊外引用。
要讓程式所包含的**僅在開發過程中執行,當程式完成準備交付就會將除錯**關閉。這可以使用_debug
和ndebug
預處理變數來實現。
ndebug是在
ansi c
中定義的。
int main(int argc,char**argv)
如果ndebug
未定義程式就會將錯誤資訊寫到
cerro
中,如果
ndebug
已定義,程式執行時將會跳過
#ifndef
和#endif
。預設情況下ndebug
未定義,也就意味著
#ifndef
,#endif
之間的**必須執行。
如果ndebug
未定義assert
斷言就會被執行。如定義
ndebug
,assert
將不被執行。
這裡要將ndebug與vc
中的_debug
區別開。
vc定義
_debug
有其用途
, 它控制其它巨集比如
_assert
的行為,
但與assert
無關。assert
是ansi c
標準的斷言巨集,
_assert是vc
提供的眾多斷言相關的巨集中的乙個。雖然做
windows
下開發的會注意到
vc編譯選項
release
版都有乙個
ndebug巨集,
但這個巨集的引入不是微軟特定的。而是在
ansi c
中定義的。在
vs中使用
debug
模式,預設情況下將定義
_debug
。使用release
模式,預設情況下將定義
ndebug
。標準ansi c
還定義了其餘
4個在除錯中非常有用的常量
, 這些常量在
debug
和release
模式下均可使用。
1:__file___
檔名2:
__line__
行號3:
__time__
檔案被編譯時間。
4:__date__
檔案被編譯的日期。
assert是在
casset
標頭檔案定義的,它有點想函式呼叫,需要乙個表示式作為它的條件,如
assert(i>j),
如果i>j
為真,則不做任何操作,若
i>j
為假,assert
輸出資訊並且終止程式的執行。在
vs中微軟定義了
_assert
斷言功能與
assert
相同。
以下為對以上介紹的**測試,可以幫助更好的理解。
#include#includeusing namespace std;
int main(int argc,char**argv)
在vc的debug模式下的執行結果為:
在release模式下的執行結果為:
C primer第二次閱讀學習筆記(第3章)
第三章 在標頭檔案中應該使用完全限定的標準庫名字,如std cout 而不應該使用 using std cout 或using namespaces std 在標頭檔案中放置 using 宣告,就相當於在包含該標頭檔案的每個程式中都放置了同一 using 宣告。應該在標頭檔案中包含確實需要的東西,遵...
C primer第二次閱讀學習筆記(第4章)
c 語言應盡量使用 vector 和迭代器型別,應避免使用低階的陣列和指標,涉及良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。因此要向成為乙個真正的 c 程式設計師就要多使用 vector 和string 來替代陣列和 c風格字串。陣列的維數必須用整型常量指定,非const 型別或是到執...
C primer第二次閱讀學習筆記(第5章)
對於兩個數的除法和求模,若均為正,則結果均為正。若均為負,除法結果為正,取模的結果為負。若一正一負,則結果依賴於具體編譯器。之所以不能串聯使用關係操作符如if i,因為關係操作符具有左結合特性。i首先比較,比較的結果為0或 1,然後在與 k進行比較,只要 k 1,結果恒為真。對於判斷與bool 值相...