1.++不能認為是原子操作,a是全域性變數,在記憶體中,則++a一般被分為從記憶體取a到暫存器、+、回寫到記憶體三步.
兩個執行緒併發執行以下**,假設a是全域性變數,那麼以下輸出_哪個是可能的?
int a=1;
void foo()
解析假設執行緒x和y同時執行,x和y可隨時被搶占,a的初始值為1
a:3, 2
y先執行++a,a為2;
y再執行printf,a入棧,在列印到終端之前切換到x
x執行++a,a為3;
x執行printf,輸出3;再切換到y
y執行列印,輸出2
b:2 3
x先執行++a,a為2;
x再執行printf,輸出2;切換到y
y執行++a,a為3;
y執行printf,輸出3;
c:3 3
x先執行++a,a為2;切換到y
y執行++a,a為3;
y執行printf,輸出3;切換到x
x執行printf,輸出3
d:2 2
類似c, 執行++a操作但沒有寫回到記憶體
這裡關鍵有兩點:
(1)兩個執行緒可隨時被搶占
(2)++a和printf不是原子指令,可隨時被打斷;特別注意函式printf,a作為引數壓棧後,a再變化則不會影響輸出(printf實際列印的是壓棧的引數,是值拷貝的棧變數)
2.char *strcpy(char* dest, const char *src) 把從src位址開始且含有null結束符的字串複製到以dest開始的 位址空間
void *memcpy(void *dest, const void *src, size_t n); 從源src所指的記憶體位址的起始位置開始拷貝n個位元組到目標dest所指的記憶體位址的起始位置中
void *memmove( void* dest, const void* src, size_t count ); 由src所指記憶體區域複製count個位元組到dest所指記憶體區域。
void *memset(void *s, int ch, size_t n); 將s中當前位置後面的n個位元組 (typedef unsigned int size_t )用 ch 替換並返回 s
memcpy與memmove的目的都是將n個位元組的源記憶體位址的內容拷貝到目標記憶體位址中。
但當源記憶體和目標記憶體存在重疊時,memcpy會出現錯誤,而memmove能正確地實施拷貝,但這也增加了一點點開銷。
3.模板的好處
(1)可用來建立動態增長和減小的資料結構 (2)它是型別無關的,因此具有很高的可復用性。 (3)它在編譯時而不是執行時檢查資料型別,保證了型別安全 (4)它是平台無關的,可移植性 (5)可用於基本資料型別
4.合法的浮點數有兩種表示形式:
十進位制小數形式。他有數字和小數點組成,必須有小數點。例如(123.)(123.0)(.123)。
指數形式。如123e3。字母e(或e)之前必須有數字,e後面的指數必須為整數。
規範化的指數形式裡面,小數點前面有且只有一位非零的數字。如1.2345e8
5.mode有以下幾種方式:
開啟方式說明r
以唯讀方式開啟檔案,該檔案必須存在。
r+以讀/寫方式開啟檔案,該檔案必須存在。
rb+以讀/寫方式開啟乙個二進位制檔案,只允許讀/寫資料。
rt+以讀/寫方式開啟乙個文字檔案,允許讀和寫。
w開啟只寫檔案,若檔案存在則長度清為0,即該檔案內容消失,若不存在則建立該檔案。
w+開啟可讀/寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留(eof符保留)。
a+以附加方式開啟可讀/寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,則寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留(原來的eof符 不保留)。
wb以只寫方式開啟或新建乙個二進位制檔案,只允許寫資料。
wb+以讀/寫方式開啟或建立乙個二進位制檔案,允許讀和寫。
wt+以讀/寫方式開啟或建立乙個文字檔案,允許讀寫。
at+以讀/寫方式開啟乙個文字檔案,允許讀或在文字末追加資料。
ab+以讀/寫方式開啟乙個二進位制檔案,允許讀或在檔案末追加資料。
6.因為負數的範圍比正數大乙個,比如8位的二進位制,可以表示範圍為-128~127
所以abs(-128)可能並不能表示為128
所以只能返回原值
牛客 C 刷題day25
1.在乙個物件未建立起來時通常用的是拷貝建構函式,而物件建立起來之後的複製拷貝就需要使用賦值運算子過載了。拷貝建構函式形式如下 cexample const cexample c 就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特殊的建構函式,函式的名稱必須和類名稱一致,它必須的乙個引數是本型...
牛客 C 刷題day13
1 復合語句也被稱為語句塊,它至少要包含兩條語句 但是你不妨在語句裡寫個空也行,只不過這種操作必然會被編譯器過濾掉 2 死 死 的英文是dead code。是指在程式操作過程中永遠不可能被執行到的 通過aqtime覆蓋率的分析就可以發現所有的永遠都不會執行到的 但是與程式無關的 卻不一定能夠全部發現...
牛客網C 刷題
今天刷了些c 的題,就其中物件導向分享一下我的感悟。首先區分一下物件導向和面向過程 物件導向是首先抽象出各種物件 各種類 把資料和方法都封裝在物件中 類 然後各個物件之間發生相互作用。面向過程是將問題分解成若干步驟 動作 每個步驟 動作 用乙個函式來實現,在使用的時候,將資料傳遞給這些函式。stl有...