`
fixopen
  • 浏览: 83965 次
文章分类
社区版块
存档分类
最新评论

C/C++奇怪语法之 = 0;

阅读更多
在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。
分享到:
评论

相关推荐

    C++/C 实例 初学者有帮助

    描述中指出,这些例子可能包含了一些C语言的语法,这并不奇怪,因为C++是C语言的超集,它兼容大部分C语言的语法。 C++是一种通用的、面向对象的编程语言,由Bjarne Stroustrup于1983年在C语言的基础上发展起来。它...

    Dev-C++详细安装配置教程及图解.docx

    Dev-C++ 是一款基于 MinGW 的免费开源 C/C++ 集成开发环境 (IDE),适用于 Windows 操作系统。它以其简单易用的界面、丰富的功能集和对多种编译器的支持而受到广泛欢迎。Dev-C++ 特别适合初学者和教育用途,同时也被...

    010EditorWin64Portable14.0-二次修整版.rar

    010Editor Professional 是一个十六进制编辑器,它可以用来查看和编辑二... 脚本自动化执行:支持使用类似于C/C++的语法脚本自动执行编辑操作,方便用户进行批量处理和操作。 总之,010Editor软件的功能特色包括专业的

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -----------------------------------------------------------------------...

    C语言FAQ 常见问题列表

    难道在C语言中一个结构不能包含指向自己的指针吗? o 2.7 怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组? o 2.8 函数只定义了一次, 调用了一次, 但编译器提示...

    2012蓝桥杯【初赛试题】古堡算式.pdf

    该题目是2012年蓝桥杯编程竞赛的初赛试题,主要考察的是选手的逻辑推理和递归算法的应用。题目中给出的场景是福尔摩斯在古堡探险...同时,题目也考察了选手对C++语言的理解和运用,如指针、循环和条件判断等基本语法。

    C经典书籍推荐

    根据提供的文件信息,标题“C经典书籍推荐”与描述“C经典书,为什么只能传一个呢,真是奇怪。”以及标签“C语言”,可以推断出本文档的主要目的是推荐关于C语言的经典书籍,并对推荐书籍的一些特点进行简要讨论。...

    你必须知道的495个C语言问题

    1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 1.29 为什么我的编译器不允许我定义大数组,如doublearray[256][256]? 命名空间 1.30如何判断哪些标识符可以使用,哪些被保留了...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    你必须知道的495个C语言问题(PDF)

    难道在C语言中一个结构不能包含指向自己的指针吗? . . . . 3 1.7 怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返 回指向字符的指针的函数的指针的数组? . . . . . . . . . . . . . . 3 1.8 函数只定义...

    新特性-c99标准

    在C语言的发展历程中,ANSI标准化之后,虽然C++持续地发展和完善,但C语言的标准经历了一段较长时间的停滞期。直到1999年,C语言的标准经历了一次重要的更新——C99标准的发布。这一标准由国际标准化组织(ISO)制定...

    2015年第六届蓝桥杯大赛个人赛省赛(软件类)

    1. **基础语法**:包括C++和C语言的基本语法,如变量、数据类型、运算符、控制结构(如if语句、for循环、while循环)、函数定义与调用等。 2. **指针与内存管理**:这是C++和C语言的重要特性,参赛者需要理解指针的...

    程序的源代码

    4. **宏定义和预处理器指令**:C/C++等语言中的宏定义和预处理器指令,如`#include`,`#ifdef`等,若使用不当,也可能导致编译错误。确认这些指令正确地被调用和定义。 5. **编译器设置**:编译器的配置选项,如...

    Tinyxml 源代码(VC6 & VS2005)

    如果文件或者数据流以非标准但普遍的"UTF-8引导字节" (0xef 0xbb 0xbf)开始,TinyXML会以UTF-8的方式来读取它。 如果包含有encoding="UTF-8"的声明被读取,那么TinyXML会以UTF-8的方式来读取它。 如果读取到没有指定...

    c#学习笔记.txt

    下列转换属于显式转换: object 0=(object)i; 所有隐式转换。 显式数值转换。 显式枚举转换。 显式引用转换。 显式接口转换。 取消装箱转换。 用户定义的显式转换 4, delegate(委托) delegate void D(int x); ...

    2021-2022计算机二级等级考试试题及答案No.9935.docx

    - D选项 `last=y/0`:除以零是不合法的操作,这会导致运行时错误或异常。 #### 2. Java屏幕坐标系统 - **知识点概述**:本题考查Java中屏幕坐标系统的理解。 - **详细解析**:Java中的坐标系统通常以容器的左上角...

    Thinking in Java 中文第四版+习题答案

    1.12.2 阶段0:拟出一个计划 1.12.3 阶段1:要制作什么? 1.12.4 阶段2:开始构建? 1.12.5 阶段3:正式创建 1.12.6 阶段4:校订 1.12.7 计划的回报 1.13 Java还是C++? 第2章 一切都是对象 2.1 用句柄操纵对象 2.2 ...

    Think in Java(中文版)chm格式

    1.12.2 阶段0:拟出一个计划 1.12.3 阶段1:要制作什么? 1.12.4 阶段2:开始构建? 1.12.5 阶段3:正式创建 1.12.6 阶段4:校订 1.12.7 计划的回报 1.13 Java还是C++? 第2章 一切都是对象 2.1 用句柄...

    Java初学者入门教学

    1.12.2 阶段0:拟出一个计划 1.12.3 阶段1:要制作什么? 1.12.4 阶段2:开始构建? 1.12.5 阶段3:正式创建 1.12.6 阶段4:校订 1.12.7 计划的回报 1.13 Java还是C++? 第2章 一切都是对象 2.1 用句柄操纵对象 2.2...

Global site tag (gtag.js) - Google Analytics