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

  • 相关阅读:
    我和杨兄的不同的Code First简单权限设计
    JavaScript&JQ 004_JS闭包
    省市区三级联动[JSON+Jquery]
    JavaScript 005_JS数组的CRUD
    linq头脑风暴001_聚合函数
    类成员函数指针的特殊之处
    模拟手算,计算组合数C(m,n)
    命令行版扫雷(vc08)
    UNICODE,GBK,UTF8:编码格式的区别
    画高频PCB的心得
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6848174.html
Copyright © 2020-2023  润新知