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进制整数类型输出。