牛客 C 刷題day47

2022-08-09 05:45:12 字數 2298 閱讀 1753

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有...