標籤:c++
1.下面程式的輸出結果是?
#include<stdio.h>
main(){
int b=3;
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d\n",*ptr,*(++ptr));
}
答案:
8,8
c中printf計算參數時是從右至左壓棧的。
2.下面程式的輸出結果?
#include<iostream>
using namespace std;
int main(){
float a = 1.0f;
cout << (int)a << endl;
cout << &a << endl;
cout << (int&)a << endl;
cout << "boolalpha" << ((int)a == (int&)a) << endl;
cout << endl;
cout << endl;
float b = 0.0;
cout << (int)b << endl;
cout << &b << endl;
cout << (int&)b << endl;
cout << "boolalpha" << ((int)b == (int&)b) << endl;
getchar();
return 0;
}
答案:
(int )a 是把記憶體中單元的值從其他類型解析為int類型,並建立一個臨時對象。(int &)a 是告訴c++記憶體中是一個int類型,並返回一個引用對象。
(int&)a == static_cast<int&>(a)(int)&a == reinterpret_cast<int>(&a);(int&)a 不經過轉換, 直接得到a在記憶體單元的值(int)a a在記憶體中的值轉換成int類型float類型在記憶體中儲存的形式是 ,符號位 指數 尾數由754標準:階碼採用增碼(該數補碼的反符號),尾數採用原碼所以1.0f 在記憶體中的形式為0011 1111 1000 0000 0000 0000 0000 0000所以輸出的是 0x3f8000000 在記憶體中的的儲存形式0000 0000 0000 0000 0000 0000 0000 0000(int&)a 把a強制轉換成整形參考型別(int)&a 把a的地址強制轉換成整型
(int&)a 相當於
*(int*)&a
*(int*)(&a)
*((int*)&a)
把float類型當成int類型來解釋
3.下面函數的輸出結果是?
#include<iostream>using namespace std;int main(){unsigned int a = 0xFFFFFFF7;unsigned char i = (unsigned char)a;char* b = (char*)&a;printf("%08x,%08x", i, *b);getchar();}
答案:
char *b=(char *)&a
在X86系列的機器中,資料的儲存是“小端儲存”,小端儲存的意思就是,對於一個跨多個位元組的資料,其低位存放在低地址單元,其高位放在高地址單元。比如一個 int 型的資料ox12345678,假如存放在0x00000000,0x00000001,0x00000002,0x00000003這四個記憶體單元中,那麼ox00000000中放的是低位的ox78,而ox00000003中放的是高位的0x12,以此類推。
有了以上的認識,我們可以繼續分析上面的程式為什麼輸出fffffff7:
char* b = (char*)&a;這句話到底幹了什麼事呢?其實說來也簡單,&a可以認為是個指向 unsigned int類型資料的指標對吧,(char *)&a則把&a強制轉換成 char *類型的指標,並且這個時候發生了截斷!截斷後,指標b只指向oxf7這個資料,又由於指標b是 char *型的,屬於有符號數,所以有符號數0xf7在printf()的作用下輸出fffffff7( 這個過程中其實發生了參數型別提升default argumentpromotions)。%x 表示16進位整數類型輸出。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
c++程式員經典面試題(2)