一、位运算的注意点:
我以为位运算可以对所有数据类型进行计算,毕竟我想着所有的数据都是二进制,进行位运算后可能结果有点不同,但还是可以的,但是位运算对于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; |
这里必须全局定义才行,如果不全局定义会是一个会不确定,全局变量会自动初始化为0,就跟C语言中定义整型变量一样,局部定义必须自己初始化。这里访问x就取第一个的值,因为自动初始化,x1 = 0,x2 = 1,因为x3被赋值为10,然后x4 = 11,x5 = 12,这就是enum类型的使用,这里访问x的值就是0。题目还是有点瑕疵,不过学到东西了。
四、局部变量的销毁:
这也是我经常犯的错误,以前在写几个程序的时候,都会这样用,最后结果总是出不来,就在想我明明用的指针啊,怎么就不对呢,所以以后还是注意一点了。
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就被销毁,所以结果不太确定。
五、类的实例化:
例:
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); |