zoukankan      html  css  js  c++  java
  • c++面试题

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

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

  • 相关阅读:
    详解Bootstrap进度条组件
    详解Bootstrap缩略图组件及警示框组件
    详解Bootstrap表单组件
    spring注解-@Autowired。@Resource。@Service
    spring注解-@Transactional事务几点注意
    17_8_9 Spring 注入
    MySQL常用语句
    Mysql 远程登录及常用命令
    数据库(外键及其约束理解)
    C语言队列(数组内核)
  • 原文地址:https://www.cnblogs.com/likeFlyingFish/p/5346007.html
Copyright © 2011-2022 走看看