一些凌亂的小知識

2021-05-25 17:41:35 字數 2223 閱讀 8643

1 可以使用下標操作的容器的下標引用

對容器的下標引用操作和我們對陣列引用下標操作一樣,千萬不要去引用未定義的單元,否則你將..

以vector為例:

code:

vector vec;   

for (int i = 0; i < 5; ++i)     

你不能這樣做。因為根據vector的特性,我們定義的vec這個vector型別變數目前沒分配空間。我們的引用操作將會去引用為定義單元。引起記憶體錯誤。但我們若真要想這樣為vec型變數賦值怎麼辦?

我們可以這樣:

code:

vector vec(10);   

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

ok!you can!因為此時vec變數已經有了10個int型別的記憶體空間。所以你可以對他進行引用。但此時我們仍然不可以利用賦值操作對下標為10及以後的單元進行引用。但我們可以使用cout來輸出以後單元的內容,你樣的引用不會出錯。但若在第一種情況下我們使用cout來引用仍然出錯。因為那時候vec根本沒有記憶體單元,所以我們一切的下標引用都是錯誤的。而現在不一樣了,雖然我們使用類似cout << vec[20] << endl;引用雖然已經出界,但它仍然指向已存在的記憶體單元,只不過是乙個不在我們掌握範圍內的記憶體單元罷了。但為什麼我們不可以對這樣的記憶體單元進行寫操作呢?我想 一是因為我們沒有對這樣的單元有掌握權,即我們並沒有想作業系統申請許可權,二是因為作業系統的乙個自我保護,若我們目前的下標操作指向了乙個很重要的記憶體單元,若作業系統允許寫操作,豈不是要出大問題了。呵呵。。

2 指標應注意的一些東西

若我們在程式別處已定義了乙個類型別的指標,如:

code:

vector *p = 0;  

我們在此處想判斷一下指標所指向的物件中第二個數是否為1;

我們該如何做呢?

code:

if ((*p)[1] == 1)     

這樣做行嗎?顯然我們根據我們的目的直接寫出了條件,但是我們還應該判斷該指標所指的物件是否為空,否則它會影響我們的判斷。甚至還有些對空物件對下標的引用會引起錯誤。如:vector;所以我們對於本題我們該這麼些。

code:

if ( !p->empty() && (*p)[1] == 1)     

然而這樣夠嗎?我們還應該想到一點,那就是空指標,也就是我們定義成類似這個樣子的指標:

code:

vector *p = 0;  

對空指標的引用會不會出現問題呢。這個是可想而知了;故我們還應該對一層判斷:

code:

if ( !p && !p->empty() && (*)p[1] == 1)     

這樣就應該ok,完美了吧。呵呵。。說實話其實我們僅僅用最後乙個條件進行判斷一般也不會出錯,因為我們使用的一般都是定義過的,且有內容的變數。但那樣的程式強壯性與可維護性都可差。不是嘛?

既然這裡牽涉到了!p 的用法,我是有必要說一下在條件判斷中!p 和 *p == 0的區別了:

!p 是用來判斷指標所指的物件是否為空,而*p 是來判斷p所指的內容是否為0值。它們兩個的區別在與:

① 對於所有型別的物件!p 均可以這樣寫出這樣的形式,而*p == 0;就不一定了,它要看它所指的物件是否定義了== 這樣的操作符過載,是否可以和 0 進行比較。

② 它們所進行的目的不同,乙個是判斷物件,乙個是判斷值,如:

code:

int *p =  0;   

if (*p == 0)     

code:

int value = 6;       

int *p = &value;       

if ( !p )       

對於此例我們的目的若是想判斷p所指向的值是否為0,那我們可慘了,條件永遠滿足,即使你修改過p所指向的值後再判斷,條件依然滿足。上面我們的行為是在判斷是真所指向的物件是否是空物件。顯然不是,故條件永遠成立。若不知道這點的話,那我們的除錯功夫可得多下一翻了。。呵呵。。

3 一些控制符

setfill(c) 設定填充字元

setw(t)  設定字元寬度,若寬度小於所設定的寬度,左補空格,若大於,則原樣輸出.

setprecision(n) 設定有效數字

setbase(int _base);

if _base is 8, thenmaskisios_base::oct

.

CPU的一些凌亂的知識

簡單記一下cpu的知識.鳥哥的私房菜.頻率 cpu每秒鐘工作的次數。比如intel的core 2 duo型號e8400的cpu頻率為3.0ghz,表示這個cpu在一秒內可以進行3.0x10 9次工作,每次工作都可以進行少數的指令執行之意。外頻 cpu與外部元件進行資料傳輸 運算時的速度。倍頻 cpu...

一些凌亂的Oracle設定及命令

1.alter user scott account unlock 解鎖scott使用者。2.set timing on off 顯示 關閉執行時間。3.show user 檢視當前使用者。4.select 列名1 別名,列名2 別名,列名n 別名 from table name 返的回列名為別名 ...

一些關於C語言的小知識

1.c語言中語句塊就是指大括號裡面的,乙個大括號代表乙個語句塊。語句就是裡面一條條用分號隔開的。執行時是以語句塊來分成連續或者不連續的記憶體。如 include intmain void printf i d i return0 執行結果為 如圖,靜態變數只在所定義的那個語句塊中有用,即在大括號中有...