码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-06-29 20:23:58      阅读:168      评论:0      收藏:0      [点我收藏+]

标签: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
所以输出的是 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进制整数类型输出。

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:c++

原文地址:http://blog.csdn.net/u012361418/article/details/46683667

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!