看下面一段代码:
struct test {
int body1:1;
int body2:2;
};
这里提出的问题是,结构体里面的冒号的作用是什么。这种冒号的用法不是我随便杜撰的,而是在实际的代码里面看到的。
在C++的函数定义时,参数列表之后可以使用冒号来给变量赋值,这里的冒号是不是也起着给结构体成员赋默认值的作用呢?是与不是,通过测试来揭晓。
首先,我写了一个测试驱动函数test来专门进行测试,如下:
void test()
{
structtest struction;
printf("body1:%d; body2:%d\n", struction.body1,struction.body2);
}
在定义结构体变量struction时,我没有给它赋值,以此来测试是不是给它的成员赋了默认值{1,2}。该函数在编译后,运行的结果如下:
body1:0; body2:0
失望了,不是我们认为的默认赋值。
那么修改变量的定义,给它们赋值后再打印,如:struct test struction = {1,2};
这次,程序编译后的运行结果是:
body1:-1; body2:-2
这次的结果怎么解释?是不是冒号起一个取负数的作用,后面的数字没用?还是其它,再取几组数字试试:
struct test struction = {1,2};
结果:body1:-1; body2:-2
struct test struction = {1,4};
结果:编译报错,在struct test struction = {1,2}赋值语句处:warning:overflow in implicit constant version。
居然出现了溢出,应该是在把4赋给struction.body2时溢出。这下,有结果了,冒号后面的数字表示的是数位。
据我推测,冒号在这里的用处主要为限制使用位数:
x:num,表示x只有其最后的num个bit位有效,且在计算时是用的“补码”表示。
如x:3,如果x赋值为7,则x值为“-1”(第三位为1,表示负数,其它位取反加1,为01,则结果为-1)。
另外,结果的正负是与变量本身的定义有关。
如x为Int时,x:3,赋值为7,则实际结果为-1,若x为 unsigned int,则x:3,赋值为7时,结果为7.