兩道最最基礎的題:

再次說明,面試會面試很多方面,這兩道題只是面試中百分之幾的技術能力的測試.

我不敢說精通,我只能說熟練,於是我這個熟練的人對那個精通的大牛出了兩道最最基礎的題:
1.class A{}
語句A a;在java,c#,c++中各發生了什麼?

2.x = new int[10];
x[20] = 100;在java,c#,c++中分別發生了什麼?

------------------

1.class A{}
語句A a;在java,c#,c++中各發生了什麼?

在java和c#中申明瞭一個引用,並在堆棧上爲這個引用分配空間(我猜是4byte,具體由vm決定),但是沒有構造出對象,引用也未初始化。

在C++中,在堆棧上分配空間(至少1字節)並生成了一個對象A

2.x = new int[10];
x[20] = 100;在java,c#,c++中分別發生了什麼?

在java中拋出IndexOutofBoundException,該線程中止,除非try捕獲,但由於是runtimeException,所以不應該捕獲。
在C#中也會拋出IndexOutofboundException,但是不會結束程序,如果沒有try,會有個對話框提示繼續運行還是結束
在C++中無異常,會改寫不屬於自己的內存空間的內容,造成的後果無法預料。

 

參考答案(只是參考):

1.java和c#中,爲符號a在棧中分配了空間,即符號a指向了棧中這個地址.這個地址的值爲無意義值,沒有指向任何對象.
c++中,在棧中爲符號a分配了空間,並在棧中生成了一個對象,符號a指向的地址上的值指向了這個對象的地址.
如果c#和java生成A對象,永遠在堆上,不會在棧上

主要明白,變量自己分配空間和變量指向的對象分配空間的區別.

2.java,c#發生邊界溢出異常(因爲運行環境對數組邊界要做檢測).
c++中不發生邊界溢出異常,但後果不能確定.

主要明白c++數組的存儲方式.即指針指向數組的第一個元素的地址.而向下索引時即指針指向第一個元素的地址+元素
大小的偏移.這樣如果越界則訪問的是非該數組的存儲空間.可能是其它變量的值,或涵數返回值等.其後果無法確定.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章