對於兩個數的除法和求模,若均為正,則結果均為正。若均為負,除法結果為正,取模的結果為負。若一正一負,則結果依賴於具體編譯器。
之所以不能串聯使用關係操作符如if(i,因為關係操作符具有左結合特性。
i首先比較,比較的結果為0或
1,然後在與
k進行比較,只要
k>=1,
結果恒為真。
對於判斷與bool
值相等與否,一般都是判斷非假,
if(val!=false)
,或是寫成
if(val),
因為val
可能是int
或是相關型別,如果使用
if(val==true)
,此時只有當
val==1
時才成立,而對於
int型別來說非零即為真,
0為假。
前置自增自減運算子效率較後置自增自減運算子較高。因為前置運算子只需加一或減一後返回結果,而後置運算子必須先儲存原來的值,再加一或減一。
對於cout<<*iter++
,很容易讓人疑惑。它等同於
*(iter++)
,因為自增運算子優先順序高於解引用操作,且它們都是從右向左結合。此句也相當於
cout<<*iter;iter++;
因為iter++
自增後,返回原值的副本,然後在解引用此值。
條件操作符的優先順序相當低,應該注意使用括號。如cout<<(i;如果寫成
cout<;它將i和
j的值相比較後的值視為
cout
的運算元,輸出0或
1,<<
操作符返回
cout
值,然後將返回結果作為條件操作符的判斷條件。
對於內建的型別,動態申請空間如int*p=new int:
與int*p=new int()
,有顯著的差別,第一種情況
int變數沒有被初始化,第二種被初始化為
0。對於類型別,第一種寫法與第二種寫法沒有顯著差別,類的預設建構函式都會被呼叫。
堆空間可能會被耗盡,因此動態申請記憶體可能會失敗。動態記憶體交換並不能保證堆空間隨用隨有。
delete動態申請的空間之後要將指標置為
null,
否則將變成野指標。有可能被誤用。兩次對同一塊堆空間呼叫
delete
可能會導致堆空間被破壞。
const_cast用於去掉表示式
const
性質。如
const char *ptr;char *p=const_cast(ptr)
;去除了
ptr的
const
屬性。
static_cast,編譯器隱式執行的任何型別轉換都可以由
static_cast
顯式完成。用於基本資料型別之間的轉換,如把
int轉換成
char
,把int
轉換成enum
。這種轉換的安全性也要開發人員來保證。把空指標轉換成目標型別的空指標。把任何型別的表示式轉換成
void
型別。
舊式的強制轉換符號有兩種形式,如int(ptr)
,或(int)ptr
;但這是
c語言的強制型別轉換,雖然
c++支援,但是推薦使用
c++中的強轉操作符。
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第二次閱讀學習筆記(第6章)
第六章 在switch 中只有在最後乙個 case 或是default 語句之後才能定義變數,之所以這樣規定是為了避免 跳過變數定義和初始化。如switch val 為了解決這種情況,可以為每個case 語句新增 花括號,引入塊語句,在該塊定義的變數只能在該語句塊中使用。對於do while 迴圈d...