【c++ Primer 】 4.10複習題 12題(int)、(int&)和(int*)

來源:互聯網
上載者:User
 (1)首先通過一個例子看(int)和(int&)的區別:

float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // boolalpha 用符號形式表示真假
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;

 

輸出:

1

1065353216

false

0

0

true

 

解釋:

        (int)a實際上是以浮點數a為參數構造了一個整型數,該整數的值是1;

        (int&)a則是告訴編譯器將a當作整數看(並沒有做任何實質上的轉換)

        因為1以整數形式存放和以浮點形式存放其記憶體資料是不一樣的,因此兩者不等。

        但是0的整數形式和浮點形式其記憶體資料是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數值意義上)。


注意:

        程式的輸出會顯示(int&)a=1065353216,這個值是怎麼來的呢?前面已經說了,1以浮點數形式存放在記憶體中,按ieee754規定,其內容為0x0000803F(已考慮位元組反序)。這也就是a這個變數所佔據的記憶體單元的值。當(int&)a出現時,它相當於告訴它的上下文:“把這塊地址中的內容當做整數看待!不要管它原來是什麼。”這樣,內容0x0000803F按整數解釋,其值正好就是1065353216(十進位數)。
        通過查看彙編代碼可以證實“(int)a相當於重新構造了一個值等於a的整型數”之說,而(int&)的作用則僅僅是表達了一個類型資訊,意義在於為cout<<及==選擇正確的重載版本。

 

(2)(int*)是將一個變數(此變數不能是浮點型,可以是整型、字元、指標)以地址的形式顯示,和(int&)的原理一樣,當(int&*)a出現時,它也相當於告訴它的上下文:“把這塊地址中的內容當做一個地址看待!不要管它原來是什麼。”

例如:

      char p='a';

      cout<<(int)p<<endl;

      cout<<(int*)p<<endl;

 

輸出:

      97

      00000061  //97的十六進位數

 

這在輸出字元數組的首地址時十分有用:

     char *p="abcd";

     cout<<(int*)p<<endl;

 

否則cout<<p<<endl;

輸出的是abcd,而不是其首地址。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.