C 與C語言容易忽視的幾個差異

2021-06-06 02:38:07 字數 1301 閱讀 1110

7次

c和c++之間的關係非常的密切,我們也都知道c++是從c擴充而來的,但是這並不表示c++對c完全相容。c++並不是c的超集,c的有些特性在c++中並不適用。

看完《c專家程式設計》之後,從中了解到了幾個。簡單總結一下。

(1)在c++中,使用者**不能呼叫main函式,但在c語言中卻是允許的。(所以可以遞迴呼叫main函式)

比如:

#include

int a=5;

int main()

return 0; }

輸出如下:

call main again:5

call main again:4

call main again:3

call main again:2

call main again:1

(2)完整的函式原型宣告在c++中是必須的,但在c語言中卻沒有這麼嚴格。因為c++有著比較嚴格的型別檢查,而c卻相對比較靈活。

(3)當void*指標賦值給另乙個型別的指標時,c++規定必須進行強制型別轉換,但在c中卻不是必要的。

所以當將c**轉換為c++**時,對於那些記憶體分配的操作,比如mallco或calloc,使用c++編譯器編譯時這些地方都會報錯:型別不匹配。

(4)在c++中,字元常量的型別是char,而在c語言中他們的型別是int。

這一點我以前從來不知道。

比如:

#include

int main()

我使用gcc編譯器編譯,執行的結果是4

而使用g++編譯執行的結果是1.

在windows平台下的結果也是一樣的。

這一點非常容易忽視,如果不注意的話可能會成為引起程式異常的重要原因。

(5)c語言中的型別提公升一定要特別注意。

型別提公升可能發生在表示式中,這是很常見的,也可能發生在引數傳遞中。

這可以解釋為什麼printf函式的%d可以適用於short,char或int型別,因為不論上面的哪個型別,函式在從堆疊中(或暫存器中)取引數時總是int型。

如果使用printf函式輸出比int長的整型入long long的話,就會出問題,這個也就是在網上有人討論的,如何使用printf來列印64位的整型數的問題,一般要使用格式限定符%ld。因為%d預設的是int型(一般32位),所以就出問題了。

MyISAM幾個容易忽視的配置選項

為什麼80 的碼農都做不了架構師?myisam在讀操作佔主導的情況下是很高效的。可一旦出現大量的讀寫併發,同innodb相比,myisam的效率就會直線下降,而且,myisam和innodb的資料儲存方式也有顯著不同 通常,在myisam裡,新資料會被附加到資料檔案的結尾,可如果時常做一些updat...

c語言中容易出錯的幾個地方

1 常量與變數判斷是否相等時,一般把常量寫在前面,這樣若少寫乙個 會出現錯誤提示,方便改正。2 判斷浮點數是否相等時,不允許用 因為有些小數部分因為二進位制轉換導致不能儲存準確的值。一般設定乙個精度來做判斷,如果兩數之差的絕對值處於精度之外的話,我們可以看做兩個數相等。const double ex...

c 容易被忽視的細節序列 (一)

1.std size t numdigits int number 函式返回型別被定義為std size t 這表示size t是被定義在std命名空間之內。std幾乎是所有c 標準程式庫元素的棲身之處。另外size t只是乙個typedef,是c 計算個數時用的不帶正負號型別 unsigned 例...