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。
VSCode C/C++开发:深入解析c_cpp_properties.json配置原理与实战 在C/C++开发中,集成开发环境(IDE)的智能感知(IntelliSense)功能是提升编码效率的核心工具,它依赖于对项目编译环境的准确理解。其工作原理是通过解析代码的语法和语义,构建一个虚拟的编译上下文,从而提供精准的代码补全、错误检查和跳转定义。这项技术的核心价值在于弥合了编辑器与底层构建系统(如CMake、Makefile)之间的信息差,确保开发者获得与最终编译行为一致的实时反馈。在实际应用场景中,尤其是在跨平台项目或依赖复杂第三方库时,手动同步编辑器与编译器的配置(如头文件路径、预定义宏和语言标准 阅读详情

相关推荐

C/C++占位符,%x和%p的区别

今天遇到了一个很奇怪的问题,当使用`malloc`分配了一个堆空间后,分别尝试用`cout`和`printf`尝试打印该地址,出现了两个地址不一样的情况:可以看出两个地址低32位是一致的,出现问题的原因应该是`printf`显示不全导致的。

ChenYX的博客 20万+

c++中函数声明的后面加=0

纯虚函数是在声明虚函数时被“初始化”为0的函数。声明纯虚函数的一般形式是 virtual 函数类型 函数名 (参数表列) =0; 注意: ①纯虚函数没有函数体;          ②最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”;           ③这是一个声明语句,最后应有分号。 纯虚函数只有函数的名字而不具备函数的功能,不能被调用。它只是通知编译系...

qq_39907831的博客 9924

你的C/C++程序为什么无法运行?揭秘Segmentation fault (1)

什么让你对C/C++如此恐惧?晦涩的语法?还是优秀IDE的欠缺? 我想那都不是问题,最多的可能是一个类似这样的错误: 段错误(Segmentation fault)这是新手无法避免的错误,也是老手极力回避也经常遇到的错误。 本篇,试图简略地剖析一段会引发这个错误的程序,带来一些启发。先看两份代码,一份是错误的.错误代码#include "string.h" #include <stdlib.h

浩然之气,兼容并蓄 http://blog.youkuaiyun.com/gsky1986 1万+

C++接口类的函数为什么等于0 ,如 classA()=0;

class ClassA() { public: ClassA() = 0; void func() { } protected: int funB() { return 3; } } 等于0,表示为纯虚函数。拥有纯虚函数的类是抽象类,抽象类一般作为基类,不能用来定义对象。

知行合一 2968

Android 10 根文件系统和编译系统(十):Android.mk编译动态库

配套系列教学视频链接: Android 10.0 AOSP源码编译: 2-AOSP源码开发环境搭建 Android 10.0 根文件系统和编译系统: 3-Android根文件系统和编译系统 说明 系统:AOSP Android10.0 设备:Android模拟器 前言 本文章重点讲解Android.mk如何控制编译源码编译成动态库 ...

ldswfun的专栏 932

quartus 13.1常见报错解决方法

在使用quartus中会遇到很多由于安装或设置不规范造成的错误。我就目前我遇到的一些错误以及我的解决方法分享给大家,这个文章将会持续更新,如果读者有遇到软件中错误无法解决的问题,也欢迎在评论区留言。 一、编译出现lience错误 在对设计的电路编译时,系统在程序运行3秒内即结束并报错,大概意思为现有的证书不支持编译。这个常见问题源自破解不成功,这里读者很有可能犯的错误是在使用破解器的时候没有区分x86(即32-bit)和x64软件破解器对应的文件夹。 如图所示有两种破解器,分别对应32位和64位的软件,大部

肥宅的博客 3万+

c++ 特殊构造函数----- 参数为 0

c++中,成员函数生命时候初始化会有异常如下: In-class initialization of non-static data member accepted as a C++11 extension 不可以直接初始话,需要再构造函数中初始化,如下 MessageManage() : m_session( 0 ), m_messageEventFilter( ...

mmdev 417

避坑指南:CST粒子工作室Track Solver常见的5个参数设置错误

本文深入剖析了CST粒子工作室中Track Solver在电子枪仿真时常见的5个关键参数设置错误,包括空间电荷模型选择、发射源定义、材料边界处理、监视器配置及求解器稳定性设置。通过对比错误与正确做法,帮助用户避开陷阱,确保粒子追踪仿真的物理准确性与数值稳定性,从而获得更精准的电子枪仿真结果。

dapp9builder的博客 486

C++虚函数后加 = 0

虚函数后面加 = 0,表示这个函数为纯虚函数,纯虚函数的一般形式:virtual 函数类型 函数名 (参数表列) =0; 特点: 1.纯虚函数没有函数体; 2.一个类里如果包含=0的纯虚函数,那么这个类就是一个抽象类 3.抽象类不能具体实例化(不能创建它的对象),而只能由它去派生子类 4.在派生类中对此函数提供定义后,它才能具备函数的功能,可被调用。 ...

贾作真时真亦贾的博客 9730

模拟IC设计笔记:拆解一个经典的时钟占空比校正(DCC)电路模块,从理论到SPICE仿真

本文深入解析了时钟占空比校正(DCC)电路在模拟IC设计中的关键作用,特别是在高速ADC应用中。通过晶体管级拆解,详细介绍了基于电荷泵和积分器的模拟反馈型DCC电路设计,包括占空比检测、误差放大与校正执行单元的实现。文章还提供了SPICE仿真验证方法,确保电路在100MHz时钟下的稳定性和性能。

weixin_33725722的博客 424

【DRAM存储器五十六】LPDDR5介绍--WCK2CK Leveling和Read gate training

简述LPDDR5 WCK2CK leveling和read gate traning基本原理与操作步骤

highman110的博客 8787

用vscode配置c/c++教程

用vscode优雅配置c/c++环境!到底是什么?问起很多人,却感到这中间误解颇深,很多人觉得它是一款编译器,也有一些人觉得它是一款轻量的IDE。确切地说,只是一款文本编辑器,它和你电脑上的记事本并没有什么两样,。但强大之处在于,也许你在马路上看到的是两辆车在疾驰,但其中一辆开着开着突然变身,这时你才发现,原来我一直把它当普通的汽车来看,没想到竟然是变形金刚!而,就是一个功能强大的变形金刚。可扩展性强是它最大的优势,你可以让 vscode 变成任何你想要的形状,甚至是你的形状。

不务正业的树 1919

Camunda 7.x 系列【22】全局监听器

Camunda支持义一个全局ExecutionListener和一个全局TaskListener,会捕获流程中发生的所有事件的通知,这样可以定义一个全局的审批人检查监听器,作用于所有用户任务。

记录知识、锤炼自我 2941

C/C++基础:宏

(a > b)?return 0;(a > b)?return 0;(a > b)?(a > b)?a : b }?(a > b)?a : b }但是如果这个宏的替换列表很长呢?// 这是正确的实现// 这是正确的实现 # define max(a , b) {

qq_73143395的博客 2457

Python 爬虫实战:在房天下抓取房产信息,分析房价走势

通过本次 Python 爬虫实战,我们成功地从房天下爬取了房产信息,并进行了存储、处理、分析和可视化展示。在这个过程中,我们不仅掌握了爬虫技术的基本应用,还学会了如何对动态加载的数据进行处理和分析。然而,本次爬虫任务也存在一些局限性,例如仅爬取了部分区域的房产数据,且未对房产的图片和视频内容进行分析。在未来的工作中,我们可以进一步优化爬虫程序,爬取更多区域的房产数据,并深入分析房产的多媒体内容、用户行为模式等,为购房者和房地产从业者提供更有价值的数据支持。

u014481728的博客 1366

UNet 改进(45):轻松集成Triplet Attention,让分割效果起飞!

本文介绍了一种在U-Net架构中集成CSRA残差注意力模块的方法。该模块通过结合通道注意力和空间注意力机制,在U-Net的瓶颈层对特征进行自适应重标定,使网络聚焦于关键区域。文章详细解析了代码实现,包括基础构建块DoubleConv、核心CSRA模块原理及其在U-Net中的战略位置集成。测试表明该模型能保持标准U-Net的输入输出维度,同时通过注意力机制提升特征选择能力。这种模块化设计便于在不同任务中应用,为图像分割领域提供了有效的注意力增强方案。

2401_82355416的博客 104

解决C/C++相互调用

概述:比较详细的解释C/C++混合编译的原理,基于GNU工具演示。 基础知识:GNU工具链的简单使用,能明白 gcc -o -c这样的命令就行了,自己调试运行一次代码就能明白。如果只是照这个别人的代码,写了一个中间层去满足混合编译的需求,最后你还是会把自己绕晕。 先要把这两个错误的想法彻底弄明白,才能把混合编译弄清楚。 错误1:gcc只能编译c,g++只能编译c++。 错误2:使用g++编...

qq_29239993的博客 790

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

stable-diffusion.cpp:纯C/C++实现AI绘画推理,打造轻量高效的生成式AI运行时

在生成式AI领域,Stable Diffusion等扩散模型已成为图像生成的核心技术。其原理基于从噪声逐步去噪生成图像的迭代过程,通过潜在空间建模实现高质量内容创作。这一技术的价值在于将前沿的AI能力转化为实际生产力,广泛应用于数字艺术创作、游戏资产生成、广告设计、教育内容制作等场景。然而,传统基于Python和PyTorch的推理框架存在启动慢、内存占用高、环境依赖复杂等问题,尤其在嵌入式设备、边缘计算和追求极致性能的C++项目中难以集成。stable-diffusion.cpp项目正是为解决这些痛点而生

weixin_33912453的博客 374

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C/C++中void与void*详解

C/C++中void与void*详解 一.void关键字的使用规则 1.如果函数没有返回值,那么应声明为void类型; 2.如果函数无参数,那么应声明其参数为void; 3.如果函数的参数可以是任意类型指针,那么应声明其参数为void * ; 4.void不能代表一个真实的变量;void体现了一种抽象;

热土程序园,利他愉己~ 3043

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C语言0xc0000142错误,第一次用c++编译器出现奇怪的报错

已结贴√问题点数:20回复次数:15 第一次用c++编译器出现奇怪的报错1>e:\c++\vc\include\yvals.h(528) : error C2059: 语法错误 : “namespace”1>e:\c++\vc\include\yvals.h(528) : error C2334: “{”的前面有意外标记;跳过明显的函数体1>e:\c++\vc\include...

weixin_30699915的博客 1106

.c文件和.cpp文件导致的编译问题

今天在编译OpenGL红宝书附带源码中的light.c文件时遇到一个诡异的问题: 如图light .c,在不做任何修改的情况编译OK。然而只要在某些地方写了可执行代码,则会无法通过编译器编译! (这几行代码如果写在main函数里的第一句则OK) 我用的VS08.我把该文件发给其他朋友(用的VS10),同样也是这样的问题。 然而,我把文件名改成light.cpp后,问题解决了。

lsldd的专栏 6511

C/C++中tag和type

C语言将tag视作二等公民类型.C++却没这么友好.本文阐述在C/C++中如何给tag头等公民类型待遇. 在编程语言中,标识符是最主要的基本元素,被用来对函数,对象,常量,类型等实体命名。 在C/C++里,一个标识符是由字母或下划线开头后接0个或多个字母,下划线或数字的字符序列。标识符是大小写敏感的,所以DAN,Dan,dan是不同的标识符。 在我对C语言的认知里,C把结构,联合和枚举的...

weixin_34217773的博客 962

C++11语法(2)

上期小编讲解了列表初始化、右值引用。接下来我们要解密之前提到过得emplace和emplace_back函数的秘密。小编打算在这篇文章中讲C++参数包(和C语言的不定参数做做比较),可以理解为C++版的不定参数。如何写出emplace和emplace_back函数。下次小编打算讲解lambda表达式、包装器、捆绑器。为了方便描述,也会讲仿函数(以前应该也讲过,再提提好理解些。

John1214的博客 914

从0到1:C++ 语法之 nullptr

本文介绍了C++11中引入的nullptr关键字。首先分析了C语言中NULL的不足:NULL在C++中可能被定义为0,导致函数重载时产生歧义。接着详细说明了nullptr的优势:它专门表示空指针,能避免类型转换问题,提高代码安全性。通过多个代码示例展示了NULL和nullptr在函数重载中的不同表现,以及nullptr需要强制类型转换的情况。最后总结建议:在C++中应优先使用nullptr而非NULL来表示空指针。

2403_88695928的博客 335

C/C++中书写汇编指令

汇编语言的指令格式目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM、NASM,Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法。 下面主要介绍Unix/Linux下的汇编,具体格式如下: [名称[:]] 指令码 源操作数SRC,目的操作数DST ;注释 开发一个OS,尽管绝大部分代码只需要用C/C++等高级语...

dianlong4020的博客 2485
上一篇: 看到一个关于lambda的非正式描述,记下来
下一篇: C/C++的缺陷之模块和实体引用,兼论C++的namespace
lifeNet
博客等级 码龄20年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值