C 容易忽略的細節

2021-08-24 22:51:03 字數 2304 閱讀 1973

1 超出資料型別指定長度的賦值

(1)無符號資料型別

unsigned char ch1= 336;

unsigned char ch2 = -1;

上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的:允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。

cout<(2) 對於有符號的書來說,要根據具體的編譯器來定。

2 浮點型的有效數字

float型別僅提供6位有效數字,double型別至少提供10位有效數字

3 definitions 和declarations(變數的定義和宣告)

主要的區別就是定義要分配儲存空間,宣告不分配存數空間,僅僅誰說明名字是什麼,型別是什麼而已。看看下面集中定義和宣告的方式:

extern int i; // 宣告

int i; //定義

extern double pi = 3.14 // 定義

4 變數的作用範圍

從宣告開始到範圍結束,區域性變數覆蓋全域性變數,看下面的**片段

int i = 100, sum = 0;

for (int i = 0; i != 10; ++i)

sum += i;

std::cout << i << " " << sum << std::endl

輸出結果應該是: i= 100 sum = 45

int sum = 0;

for (int i = 0; i != 10; ++i)

sum += i;

std::cout << "sum from 0 to " << i << " is " << sum << std::endl;

編譯出錯,因為i沒有被定義(cout中的i)

5 const 變數的作用範圍

const的變數的作用範圍是本檔案,即使它被宣告成全域性變數。要想在其他檔案中使用本檔案中定義的const變數,看下面**

// file_1.cc

// defines and initializes a

const

that is accessible to other files

extern const int bufsize = fcn();

// file_2.cc

extern const int bufsize;

// uses

bufsize

from

file_1

//uses

bufsize

defined in

file_1

for (int index = 0; index != bufsize; ++index)

// ...

在宣告和定義處都需要加extern關鍵字

6 vector::const_iterator 和 const vector::iterator

看下面兩個例子,就能明白二者的區別

for (vector::const_iterator iter = text.begin();

iter != text.end(); ++ iter)

*iter = " "; // error:

*iter

isconst

vector::const_iterator iter 允許自身變化,但不允許修改它下面指向的資料,即指向的內容是常量

vectornums(10); // nums

is non

const

const vector::iterator cit = nums.begin();

*cit = 1; // ok:

citcan change its underlying element

++cit; // error: can't change the value of

citconst vector::iterator cit 允許修改它指向的下面的資料,不允許自身的變化,即本身是個常量

7 typedef string *pstring

const pstring cstr; 解釋這個宣告的意思?

相信大部分人是這麼理解的,typedef string *pstring 是定義了乙個指向string 的指標型別,因此const pstring cstr <=> const string * cstr

即 指向乙個const string的指標,但是這是錯誤的。

正確的解釋應該是, cstr是乙個const指標,指向string型別的字串

C 容易忽略的細節

1 超出資料型別指定長度的賦值 1 無符號資料型別 unsigned char ch1 336 unsigned char ch2 1 上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的 允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。cou...

C 容易忽略的細節

1 超出資料型別指定長度的賦值 1 無符號資料型別 unsigned char ch1 336 unsigned char ch2 1 上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的 允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。cou...

android容易忽略的技術細節

1 在onpause 中進行資料持久化。activity的生命週期為oncreate onrestart onstart onresume onpause onstop ondestroy 其中oncreate onrestart onstart onresume 執行結束後不能立即結束程序,所以o...