在C中,尤其是C++中,= 0是一个非常常见和奇怪的语法之一。
0,在基本的上下文中被评估为int型的整数字面值,这个是最容易理解的。它能够被读.不能够写。就算用它赋值给浮点数,也是整数字面值并加上类型转换完成的。同时,赋值给bool也是转换。C/C++规定,0转换为bool表示false。这儿似乎没有什么更多可以说的了,不过别急。
把0赋值给指针表示该指针不知向任何对象。而不是表示该指针指向处于地址0的对象。0在C/C++的世界里经常表现为没有,不存在这个意思。
我们还能看到的一个比较奇怪的语法是吧0赋值给某个函数,这个函数一定是类的成员函数,并且必须是虚的。就象这样:
class C
{
public:
virtual void f(void) = 0;
};
这表明什么呢?想想我们前面的说法,它表示没有,不在这儿的意思。这就是著名的纯虚函数,表明该函数没有实现(奇怪的是,C++允许纯虚函数有实现,不过我还没有搞懂这样做的意义),必须由子类实现该函数。
顺便说一下,构造有时候也与0有关。
看这个:
int i = int();
你可能会觉得奇怪,谁会这样写代码呢?可是,这其实是合法的代码,这样想:int作为一种类型,int()显然就是调用这种类型的默认构造函数,这个构造函数构造一个int对象,默认值是0。奇怪么?
其实一点都不奇怪,C++本来可以不允许这样的语法存在的,不过由于引入了模版,这一切都变得必然了,聪明的,直到为什么了吧。
既然说的初始化,我再说说数组的初始化吧。
T a[n] = {x, y, z, ……};
这个是典型的数组初始化,但是,如果后面花括号里面的值的个数比n少会怎样?呵呵,C/C++规定,缺的那些值为0。注:新版的C99允许离散的元素初始化,语法是:
T a[n] = {[0] = x, [8] = y, [100] = z, ……};
没有赋值的元素默认值仍然是0。
现在大家应该能理解下面这个赋值了吧。
char msg[128] = {0};
这就是说,msg的128个元素所有的值都是0。
0,在基本的上下文中被评估为int型的整数字面值,这个是最容易理解的。它能够被读.不能够写。就算用它赋值给浮点数,也是整数字面值并加上类型转换完成的。同时,赋值给bool也是转换。C/C++规定,0转换为bool表示false。这儿似乎没有什么更多可以说的了,不过别急。
把0赋值给指针表示该指针不知向任何对象。而不是表示该指针指向处于地址0的对象。0在C/C++的世界里经常表现为没有,不存在这个意思。
我们还能看到的一个比较奇怪的语法是吧0赋值给某个函数,这个函数一定是类的成员函数,并且必须是虚的。就象这样:
class C
{
public:
virtual void f(void) = 0;
};
这表明什么呢?想想我们前面的说法,它表示没有,不在这儿的意思。这就是著名的纯虚函数,表明该函数没有实现(奇怪的是,C++允许纯虚函数有实现,不过我还没有搞懂这样做的意义),必须由子类实现该函数。
顺便说一下,构造有时候也与0有关。
看这个:
int i = int();
你可能会觉得奇怪,谁会这样写代码呢?可是,这其实是合法的代码,这样想:int作为一种类型,int()显然就是调用这种类型的默认构造函数,这个构造函数构造一个int对象,默认值是0。奇怪么?
其实一点都不奇怪,C++本来可以不允许这样的语法存在的,不过由于引入了模版,这一切都变得必然了,聪明的,直到为什么了吧。
既然说的初始化,我再说说数组的初始化吧。
T a[n] = {x, y, z, ……};
这个是典型的数组初始化,但是,如果后面花括号里面的值的个数比n少会怎样?呵呵,C/C++规定,缺的那些值为0。注:新版的C99允许离散的元素初始化,语法是:
T a[n] = {[0] = x, [8] = y, [100] = z, ……};
没有赋值的元素默认值仍然是0。
现在大家应该能理解下面这个赋值了吧。
char msg[128] = {0};
这就是说,msg的128个元素所有的值都是0。