c++程序猿经典面试题(2)

1.以下程序的输出结果是?

#include<stdio.h>

main(){

int b=3;

int arr[]={6,7,8,9,10};

int *ptr=arr;

*(ptr++)+=123;

printf("%d,%d ",*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
所以输出的是 0x3f800000
0 在内存中的的存储形式
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 argument promotions)

%x 表示16进制整数类型输出。

原文地址:https://www.cnblogs.com/clnchanpin/p/6848174.html