賦值語句
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個重要...