牛客网C++题目总结(二)

一、位运算的注意点:

        我以为位运算可以对所有数据类型进行计算,毕竟我想着所有的数据都是二进制,进行位运算后可能结果有点不同,但还是可以的,但是位运算对于float等类型的数据就不行,查阅了一下网上的一些信息,似乎得把这些类型的数据转化成整型才能够进行操作,所以理论上这些数据都是能够用位运算的,只是需要转化成整型。具体原因网上也没有查到。

二、union的认识:

曾经学习C语言时学过,但认为不重要就没听,现在了解一下还是挺有意思的。union相当于一个结构体,并且其中的成员共用一段内存。

如下题:

union Test
 {
    char a[4];
    short b;
 };
 Test test;
 test.a[0]=256;
 test.a[1]=255;
 test.a[2]=254;
 test.a[3]=253;
 printf("%d\n",test.b);

问题:在80X86架构下,输出什么值?

当然做这题还得清楚什么是80X86架构,我也不太懂,也就看看解析说一下。我这里就拿一下这里我感觉比较好的解析吧。

char类型的取值范围是-128~127,unsigned char的取值范围是0~256
这里a[0]=256,出现了正溢出,将其转换到取值范围内就是0,即a[0]=0;
同理,a[1]=-1, a[2]=-2, a[3]=-3,在C语言标准里面,用补码表示有符号数,故其在计算机中的表示形式如下:
a[0]=0,     0000 0000
a[1]=-1,    1111 1111
a[2]=-2,    1111 1110
a[3]=-3,    1111 1101

short是2字节(a[0]和a[1]),由于80X86是小端模式,即数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,在本例中,a[0]中存放的是b的低位,a[1]中存放的是b的高位,即b的二进制表示是:1111 1111 0000 0000,表示-256。

三、enum类型的注意点:

这个类似于union类型,我也不熟悉,不过还挺有趣的。可以根据enum类型中成员赋值或者在全局定义自动初始化,然后依次自动为其他成员赋值。例如下面这题:

enum string{    
    x1,    
    x2,    
    x3=10,    
    x4,    
    x5,    
} x;
函数外部访问x等于什么?

这里必须全局定义才行,如果不全局定义会是一个会不确定,全局变量会自动初始化为0,就跟C语言中定义整型变量一样,局部定义必须自己初始化。这里访问x就取第一个的值,因为自动初始化,x1 = 0,x2 = 1,因为x3被赋值为10,然后x4 = 11,x5 = 12,这就是enum类型的使用,这里访问x的值就是0。题目还是有点瑕疵,不过学到东西了。

四、局部变量的销毁:

这也是我经常犯的错误,以前在写几个程序的时候,都会这样用,最后结果总是出不来,就在想我明明用的指针啊,怎么就不对呢,所以以后还是注意一点了。

现在有以下两个函数,调用test的结果是
1
2
3
4
5
6
7
8
9
10
char* getMem(void) {     
      char p[] = “hello world ”;
       p[5] = 0x0;
       return p;
 }
 void test(void) {     
      char *s = 0x0;
       s = getMem();
       printf(s);
 }

这里getMem传回的是数组p首地址,但是要注意在传回首地址之后,p就被销毁,所以结果不太确定。

五、类的实例化:

例:

假定CSomething是一个类,执行下面这些语句之后,内存里创建了____个CSomething对象。
1
2
3
4
5
6
7
CSomething a();
CSomething b(2);
CSomething c[3];
CSomething &ra = b;
CSomething d=b;
CSomething *pA = c;
CSomething *p = new CSomething(4);
第一个CSomething a();是函数声明,然后CSomething d = b;这条语句中是调用拷贝构造函数,所以也另外创建了一个对象。因此最后答案是6个。好像这个在上次也提到过,只能说自己基础太差了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值