關於引用的討論

2021-04-26 06:56:55 字數 2961 閱讀 4370

鄭飛龍 17:17:04

這個是一道面試題,不知道這題是什麼意思?

beyond(jzk) 17:19:55

我也弄不明白...

beyond(jzk) 17:20:15

我感覺輸出應該是false true

鄭飛龍 17:20:45

答案就是這樣

鄭飛龍 17:20:49

你是怎麼看出來的

beyond(jzk) 17:22:43

float 1.0f = 0x37ff..反正是浮點數的表示..

float 0.0 =0.

beyond(jzk) 17:24:41

1.0=3f80000h

鄭飛龍 17:24:48

恩,記憶體中好像就是這樣的

beyond(jzk) 17:24:49

0.0=00000000

beyond(jzk) 17:25:22

(int)a = ftoi(a)=1.

鄭飛龍 17:25:38

恩,後面的呢

beyond(jzk) 17:25:54

(int&)a=0x3f800000

鄭飛龍 17:26:23

為什麼(int &)a

鄭飛龍 17:26:46

就是你說的那個值呢

beyond(jzk) 17:27:03

我感覺(int &)a=(int)(int*)a

鄭飛龍 17:27:19

這個意思是不是相當與把乙個浮點數當作整形給輸出了

beyond(jzk) 17:27:40

(int)a這個比較明顯=1.

鄭飛龍 17:27:49

恩,這個比較明顯

beyond(jzk) 17:28:41

(int&)a我理解的就是把a的內容也就是0x3f800000轉換成乙個位址=0x3f800000

beyond(jzk) 17:30:38

這個題應該是考的浮點數的記憶體表示吧..

鄭飛龍 17:31:10

int & r = (int &)a;

鄭飛龍 17:31:32

那麼這裡的r應該怎麼理解?

鄭飛龍 17:32:04

r 是你剛才說的那個位址是對應的

鄭飛龍 17:33:00

cout..我看暈了..

鄭飛龍 17:36:21

但是我輸出r,r的值還是0x3f800000

beyond(jzk) 17:36:23

哪個公司的面試題

鄭飛龍 17:36:44

emc鄭飛龍 17:36:51

易安信beyond(jzk) 17:37:30

如果輸出是0x3f800000的話,那應該得有乙個中間變數..

beyond(jzk) 17:37:53

你除錯看一下..

鄭飛龍 17:38:12

你說的中間變數,指的是什麼 ?

beyond(jzk) 17:39:10

(int&)a,不然r引用的位址在**..

beyond(jzk) 17:40:41

你看看(int&)a 是不是等於(int)(int*)a

鄭飛龍 17:40:50

我除錯的時候看,vc好像給r開了乙個空間,那個空間存的內容就是a變數的位址。

beyond(jzk) 17:41:34

那樣的話,r就是乙個指標了..

鄭飛龍 17:42:07

我估計底層都是這樣實現的

beyond(jzk) 17:42:20

可能吧..

beyond(jzk) 17:43:08

再遇到這種題,可以現根據自己的理解解答..

鄭飛龍 17:44:32

除錯的時候,&r和a的位址一樣,真讓人費解

鄭飛龍 17:44:42

編譯器把我都搞暈了

beyond(jzk) 17:45:37

...鄭飛龍 17:46:09

除錯是這樣,我暈的不行,實在是理解不了

鄭飛龍 17:48:32

算了,太細了,也沒什麼意思

beyond(jzk) 17:48:37

這樣理解你看行不行,反正引用肯定對應乙個變數..

鄭飛龍 17:48:48

恩beyond(jzk) 17:49:15

對於int& r=(int&)a.這個句子裡面只有乙個變數a

鄭飛龍 17:49:23

恩beyond(jzk) 17:49:52

所以r應該是a的位址別名..

鄭飛龍 17:50:01

恩beyond(jzk) 17:50:08

a的位址裡放的是0 3f800000

beyond(jzk) 17:50:19

0x3f800000

鄭飛龍 17:50:56

恩beyond(jzk) 17:51:29

不管a是什麼型別,他位址裡的16進製制內容是一樣的..

鄭飛龍 17:51:42

恩beyond(jzk) 17:52:42

只是因為引用的型別是int型的,所以輸出的是3f800000的int型值..

beyond(jzk) 17:54:00

float& m=(float&)a;

beyond(jzk) 17:55:37

(float&)a==a

鄭飛龍 17:56:01

恩,我明白了一點

beyond(jzk) 17:56:41

(int&)a==*(int*)&a

(int&)a 是取位址,位址型別轉換,取內容的簡寫形式.相當於*(int*)&a;

不管a是什麼型別 (int&)a==*(int*)&a這個等式都成立

float a=1.0f;

int& r=(int&)a;這一句是後,r是乙個指向a位址的int型引用,輸出r相當於輸出a位址的整形內容

對於這個例子

cout<

關於C 中函式返回引用的討論

從函式返回引用 確保其引用的物件在函式執行完後仍然存在。引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。永遠不要從函式中返回區域性變數的引用 c 中,返回引用是乙個比較晦澀的概念。在書中,對此僅僅做了乙個一般的介紹,並沒有展開。我覺得有必要對此進行一...

關於C 中函式返回引用的討論

從函式 返回引用 確保其引用的物件在函式執行完後仍然存在。引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。永遠不要從函式中返回區域性變數的引用.1 首先,返回引用,要求在函式的引數中,包含有以 引用方式或 指標方式存在的,需要被返回的引數。比如 in...

關於C 中函式返回引用的討論

從函式返回引用 確保其引用的物件在函式執行完後仍然存在。引用型別返回值的主要特徵是可以作為左值,這意味著我們可以在賦值語句的左邊使用返回引用的函式的結果。永遠不要從函式中返回區域性變數的引用 c 中,返回引用是乙個比較晦澀的概念。在書中,對此僅僅做了乙個一般的介紹,並沒有展開。我覺得有必要對此進行一...