基礎複習 一 程式設計基本概念

2022-05-19 06:52:51 字數 4181 閱讀 6463

賦值語句

1.i的值為?

#include using namespace std;

int i = 1;

int main()

解析:

此時main函式內的i是優先考慮區域性變數,除非使用作用域符號,否則是和外面值為1的i是無關的。

其次,使用g++編譯,g++ main.cpp -wall就會出現提示說i是未定義值的警告,因此雖然此處的i會始終輸出為0,但是實際上它是未定義值。

傳送門講的比較清楚,要把宣告、定義、初始化、賦值區分開,其中初始化又分為default initialization、 list initialization、 value initialization。第乙個說內建型別的變數是未初始化的,第三個說內建型別的變數是初始化為0的,其實測試的結果更傾向為value initialization。

2.以下**輸出的結果?

#include using namespace std;

int main()

解析:

10 //賦值號是右結合的,賦值語句的返回值是賦值符號的左邊的值

10 //等於號是比較符號,是不會改變變數的值

1 //判斷相等的符號返回true/false,也就是1或0

3 //按位取與運算

1 //邏輯取與關係,兩個運算變數都是0,結果才為0,否則為1

7 //按位取或運算

1 //邏輯取或運算

i++1.下面兩段**輸出有何不同?

#include using namespace std;

int main()

cout << a << x << endl;

return 0;

}

#include using namespace std;

int main()

cout << a << x << endl;

return 0;

}

解析:

分別是21和12,後置的自增符號相當於把自增拆出來,並放在後面一句就不多說了。

2.下面**的輸出結果是什麼?

#include int main() ;

int *ptr = arr;

*(ptr++) += 123;

printf("%d %d\n", *ptr, *(++ptr));

}

解析:

8 8在列印前,陣列的值為, ptr指向第2個。

由於c中的printf函式計算引數是從右到左壓棧(不同語言不同編譯器的函式,引數入棧順序是可以不同的,但是因為c支援可變引數函式,例如printf函式的引數就是不確定的,因此函式無法知道具體有多少引數,在建立被呼叫者的ac(activation record)時就採用了從右往左入棧引數的方式,這樣第乙個引數就在棧頂了,這個編譯原理課的道理,這有網上參考資料,之後順帶提一下,c是不支援預設引數的,關於編譯器的新學到的知識,有兩點,一點是***,一點是順序點,大意就是在這個順序點時,編譯器要處理完前面所有語句帶來的***,在這個點之後才可以進行新的語句的***的執行,那麼,在兩個順序點之間的動作執行順序是沒有規定的哦,由不同家的編譯器自己玩,科科傳送門

最後,我們這一題,先算*(++ptr),那就是第ptr指向了第三個並取值,之後再算左邊也是變成取第三個值了哦,那就是8 8.

後來經過測試(g++),發現從右往左壓棧時,每次都計算了引數的值再壓棧的。比如i++在i壓棧後i自增,而++i是在壓棧前自增再入棧。

程式設計風格

這個你已經很棒了,平時不要偷懶繼續努力就好了啊,科科

型別轉換

1.程式結果為?

#include #include #include using namespace std;

int main()

解析:

a是乙個float型別的數,float在記憶體中的儲存方式請看傳送門,(0為特例,浮點數值為0時,指數和底數都為0),那麼a記憶體中的32個位元組放的是0 01111111 00000000000000000000000;乙個int型別也是32個位元組,int在記憶體中的儲存方式請看傳送門.

(int)a表示將浮點數強制轉換為整型,小數部分將被直接截斷,結果為0;

&a輸出的是變數a在記憶體中的位置

(int&)a,是用整型的解釋方式來讀取浮點數a的記憶體,結果就為 1065353216(127<<23)

此時(int)a和(int&)a是不同的值,比較是否相等時輸出false。

而值為0的浮點數在記憶體中的表示,所有位上全為0.因此,此時用整型的解釋方式讀取記憶體得到的結果還是0.

2.下面的程式結果是什麼?

#include int main()
解析:

這裡因為考慮是x86系列機器(《計算機組成原理》的相關知識啦),是小端儲存(俗稱「低低高高」,低位元組放低位址,高位元組放高位址),所以字元型i的記憶體是整型a的小端部分,也就是f7. 而b直接對a記憶體取位址並擷取乙個位元組出來,此時得到的是小端部分f7。因為%08x是將引數以整型的16進製制格式輸出,不足部分左側補符號位,i是無符號的,b是有符號的,所以輸出為

0x000000f7 和0xfffffff7

算數轉換中的通用原則

運算子問題

1.下面程式的結果?

#include using namespace std;

int main()

解析:

b的值應該為((~a)>>(4+1)), 此時要進行算數運算就要涉及到乙個「整數提公升」的問題,也就是說a要轉成int型別才能進行計算。

那麼a轉成了0x000000a5, 進行取反0xffffff02, 右移5位後,賦給b,則b擷取了最右邊的8位為11111010, 最後按照整型的型別列印,無符號位高位元組補0,則可以得到:250(十進位制)

等號是最弱的會產生***的運算子,接著是移位,然後是四則運算,取值,單目運算等等等等

2.用乙個表示式判斷乙個數x是否是2^n,不可用迴圈語句

解析:

!(x&(x-1))返回值為false說明是2的冪次方,否則不是

3.下面**的作用?

int f(int x, int y)
解析:

相同位的與 + 不同位的平均 = 兩個數的平均值

4.利用位運算實現兩個整數的加法運算

解析:

遞迴的思想,詳細解釋

int add(int a, int b)
a、b交換與比較

1.不使用"if"、"?:"、"switch"或其他判斷語句,找出兩個數中的最大值

解釋:

方案一:利用abs函式

int max = (abs(a-b)+(a+b))/2;
方案二:判斷差值的符號位

方案三:採用bool值

bool fun(int a, int b) 

int max(int a, int b)

3.有兩個資料,寫乙個交換兩個資料的巨集

解釋:

方案一:利用異或運算(不考慮浮點數)

define swap(a, b)

方案二:利用加減法

define swap(a, b)

方案三:記憶體交換

define swap(a, b) \

c和c++的關係

程式設計的其他問題

這個就還是多刷刷題目吧,注意一些小細節就好啊,考慮問題要全面

-from 《程式設計師面試寶典》

基本概念複習

類和物件的區別?類是物件的抽象,物件是類的具體例項。類是抽象的,不占用記憶體,而物件是具體的,占有記憶體空間。例如 類就是水果,物件就是蘋果。為什麼要使用ioc?瀏覽器http快取原理分析?wcf webapi wcfrest webservice之間的區別?變數和屬性?變數是對類本身而言的,我們把...

程式設計基本概念

程式設計基本概念 一 賦值語句 1.c c code int i 1 void main 在c 中,這樣的賦值操作時合法的,int i i,i變數從宣告的那一刻起就是可見的,main 裡的i不是1,因為它與mian 外的i無關,而是乙個未定義的值。2.include using namespace ...

java併發程式設計(一基本概念 執行緒基礎)

提高程式效能 利用cpu多核特點 並行 充分利用cpu的時間片 併發 業務上需要 例如伺服器需要接收多個請求,需要用不同執行緒處理請求 硬體上速度達到瓶頸,目前晶元處理速度4ghz,已經停留了10年,需要從軟體方面提高處理能力。無鎖 lock free 無等待 wait free 有關並行的2個重要...