当前位置: 首页 > news >正文

【编程语言】C++和C的异同点

文章目录

  • 相同点
  • 不同点
    • `cin`和`scanf()`
    • 结构体`struct`
    • 指针:`NULL`、`nullptr`、`void*`

有一段时间没有发博客了,从笔记里摘录一些发两篇。

相同点

C++有很多从C继承过来的东西,因此C++书(《C++ Primer》、《C++ Primer Plus》)中有一些基础的东西讲的并没有C书详细。

基础的东西完全相同:数据类型、类型转换、变量常量、预处理器、运算符、流程控制。

以下是一些值得强调的相同点

1、charchar在默认情况下既不是没有符号,也不是有符号,是否有符号由C或C++编译器实现决定。

  • 因此,char的范围可能是-128~127,也可能是0~255
  • 如果只用char处理字符,那么char前面无需使用任何修饰符。
  • 如果char有某种特定的行为对您来说非常重要,则可以显式地将类型设置为signed charunsigned char

相关描述:《C++ Primer Plus》3.5.8 char类型:字符和小整数 - 第5点《C Primer Plus》3.4.3 使用字符:char类型 - 第5点

2、在赋值语句中等号(=)右边的类型自动转换为等号左边的类型。这条自动类型转换的规则同样也适用于强制类型转换,因此这种情况下可以不使用强转运算符。(—为什么不需要类型转换?)

3、自动类型转换都有"整型提升"、“算术转换”。

4、预处理器:C++的预处理器继承自C。
C++的两本书对预处理的介绍都非常少,分别在:《C++ Primer》2.6.3编写自己的头文件-预处理器概述《C++ Primer Plus》2.1.3 C++预处理器和iostream文件 | 3.1.3整型short、int、long和long long - 符号常量-预处理器方式用了很少的篇幅做了简单的介绍。

5、静态变量 (真正的解释)

《C Primer Plus》12.1.6块作用域的静态变量;12.1.7外部链接的静态变量;12.1.8内部链接的静态变量;12.1.10存储类别说明符
《C++ Primer Plus》9.2.3 静态持续变量;9.2.4静态持续性、外部链接性;9.2.5静态持续性、内部链接性;9.2.6静态存储持续性、无链接性;9.2.7说明符和限定符

静态变量听起来自相矛盾,像是一个"不可变"的"变量"。实际上,静态的意思是该变量在内存中原地不动,并不是说它的值不变。

以前我总以为静态变量只是static修饰的变量,即静态局部变量和静态全局变量。实际上静态变量还包括普通全局变量。

即,静态变量包括平时所谓的:静态局部变量、静态全局变量、普通全局变量(尽管它不用static修饰)。严格来说,它们分别被描述为:块作用域的静态变量、内部链接的静态变量、外部链接的静态变量。

静态变量和非静态变量的默认初始值:

  • 非静态变量,也就是普通的局部变量:程序在进入到该变量的声明所在块时才为其分配内存,在退出该块时释放之前分配的内存。如果没有手动初始化,该变量的默认初始值可能是受内存残留影响的垃圾值,是不确定的。

  • 静态变量(静态局部/全局变量、普通全局变量):由于静态变量的数目在程序运行期间是不变的,因此程序不需要使用特殊的装置(如"栈")来管理它们。编译器将分配**固定大小的内存块(静态全局区)**来存储所有的静态变量,这些变量在整个程序执行期间一直存在。如果没有手动初始化静态变量,编译器将把它设置为0

    ChatGPT-"静态全局区是固定大小的吗":静态全局区的大小会在编译时确定,在程序运行之前分配,一旦程序开始执行,它的大小就是固定的,不会动态变化。


不同点

auto关键字

  • C语言中,用于声明自动存储类别的局部变量,是局部变量的默认存储类别。由于缺乏明确性,auto关键字已经被废弃。
  • C++11中,auto关键字用来推断变量的类型,会根据初始化表达式的类型自动推断其类型,这样可以使代码更加简洁,减少手动写出变量类型的繁琐。

头文件名:C的头文件有扩展名.h,而C++的头文件名去掉了任何扩展名。

函数:C++的函数形参支持设置默认值、函数可以重载,C不行,其它都一样。

动态内存分配:C/C++——动态内存分配

  • C用的是mallocfree函数。
  • C++用的是newdelete关键字。

枚举:C枚举的一些特性并不适用于C++。例如,C允许枚举变量使用++ 运算符,但是C++标准不允许。。
(《C Primer Plus》14.11.1 enum常量)

cinscanf()

cin >> value_holder;value_holder为存储输入的内存单元,它可以是变量、引用、被解除引用的指针,也可以是类或结构体的成员。
(《C++ Primer Plus》17.3 使用cin进行输入)

scanf()scanf()使用的参数类型是指向变量的指针,即变量的地址。
(《C Primer Plus》4.4.5 使用scanf())

简单说,cin接收的是本身(不是指针),scanf()接收的是变量的地址(是指针)。

结构体struct

C中结构体和C++中结构体的区别

C++的struct和C++的class一样,唯一区别是默认访问权限不一样(structpublicclassprivate)。

  1. 默认成员访问权限:
    • C没有访问权限的概念,因此struct的所有成员都具有公共的访问权限。
    • C++的struct的默认成员访问权限是public。可以使用访问控制符修改成员的访问权限。
  2. 成员函数:
    • C的struct只能包含成员变量,不能包含成员函数。
    • C++的struct可以包含成员函数,与class一样。
  3. 成员变量的初始化:C不能在结构体中初始化成员变量,而C++结构体可以。
  4. 空结构体:C的空结构体的sizeof为0,C++的空结构体的sizeof为1。
  5. 结构体类型名:C结构体在定义时除非使用typedef,否则之后定义变量都必须使用的类型名是struct + 结构体名,而C++结构体可以省略struct,直接使用结构体名。

指针:NULLnullptrvoid*

参考 C++中NULL和nullptr的区别、【c++】 NULL和nullptr的区别和联系

  • NULL用来表示空指针,给指针类型赋值;nullptr是C++11引入的,也用来表示空指针,用来替代NULLvoid*是通用指针类型、空类型指针。
  • C语言的NULL是宏定义,值是((void*)0),即把0强制转换为void*。也就是说NULLvoid*类型的。C语言中,void*类型可以和任意类型的指针互相进行隐式转换,不需要考虑类型是否匹配。
  • C++的NULL也是宏定义,值是整数0,是int类型的。之所以不使用((void*)0),是因为C++要求在把void*指针赋给任何类型的指针时必须进行强制类型转换,这在给指针变量赋值为NULL时显然很不方便。C++的整数0可以直接赋值给指针,所以在C++中NULL的值是0

C++为什么又要有nullptr呢?因为,当具有如下的重载函数时,如果实参是NULL,那么NULL作为int类型,会触发调用第一个,但通常我们希望调用的是第二个。

void fun(int){}
void fun(void*){}

为了解决这个问题,C++11特意引入了nullptr这一新的关键字来表示空指针,nullptr的类型是std::nullptr_t,这个类型可以隐式转换为任意一个指针类型,不能转为非指针类型。因此当实参是nullptr时,就会触发第二个重载函数,这是我们希望的。所以在C++中应该使用nullptr表示空指针。

相关文章:

【编程语言】C++和C的异同点

文章目录 相同点不同点cin和scanf()结构体struct指针:NULL、nullptr、void* 有一段时间没有发博客了,从笔记里摘录一些发两篇。 相同点 C有很多从C继承过来的东西,因此C书(《C Primer》、《C Primer Plus》)中有一些基础的东西讲的并没有C书…...

【日常记录】【插件】excel.js导出的时候给单元格设置下拉选择、数据校验等

文章目录 1. 代码基本结构2. 导出的excel 某单元格的值设置为下拉选择3. 如何把下拉选择项设置为动态4. 单元格设置校验、提示5. 在WPS上的设置 1. 代码基本结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…...

分布式 I/O 系统Modbus TCP 耦合器BL200

BL200 耦合器是一个数据采集和控制系统&#xff0c;基于强大的 32 位微处理器设计&#xff0c;采用 Linux 操作系统&#xff0c;可以快速接入现场 PLC、SCADA 以及 ERP 系统&#xff0c; 内置逻辑控制、边缘计算应用&#xff0c;支持标准 Modbus TCP 服务器通讯&#xff0c;以太…...

人工智能导论-机器学习

机器学习概述 概述 本章主要介绍的机器学习的概念、发展历程、发展趋势、相关应用&#xff0c;着重拓展机监督学习和无监督学习的相关知识。 重点&#xff1a;机器学习的定义和应用&#xff1b; 难点&#xff1a;机器学习算法及分类。 机器学习 - 重要性 MachineLeaning出…...

计算机网络——网络层(路由选择协议、路由器工作原理、IP多播、虚拟专用网和网络地址转换)

目录 路由选择协议 因特网的路由选择协议特点 路由信息协议RIP RIP衡量目的网络距离 RIP选择路由器的方式 RIP具有以下三个重要特点 RIP的基本工作流程 RIP的距离向量算法 ​编辑 ​编辑 RIP存在的问题——“坏消息传播得慢” RIP的封装 开放最短路径优先协议OSPF…...

对接企业微信API自建应用配置企业可信IP

前言 为了实现系统调用团队会议功能&#xff0c;组织发起企业微信会议&#xff0c;于是需要和企业微信做API对接。对接过程很难受&#xff0c;文档不清晰、没有SDK、没有技术支持甚至文档报文和实际接口报文都不匹配&#xff0c;只能说企业微信的API是从业以来见过的最难用的AP…...

Windows右键新建Markdown文件类型配置 | Typora | VSCode

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张分享的是如何在右键的新建菜单中添加新建MarkdownFile文件&#xff0c;这是毛毛张分享的关于Typora软件的相关知识的第三期 文章目录 1.前言&#x1f3dd;…...

PyTorch构建一个肺部CT图像分类模型来分辨肺癌

当你有5万个标注的肺部CT DICOM图像数据&#xff0c;并且希望使用PyTorch构建一个肺部CT图像分类模型来分辨肺癌&#xff0c;以下是详细的步骤和示例代码&#xff1a; 数据准备 首先&#xff0c;确保你的数据集被正确分为训练集、验证集和测试集&#xff0c;并且每个图像都有相…...

MySQL简介及数据库

mysql简介 mysql是一个轻量级关系型数据库管理系统&#xff0c;具有体积小&#xff0c;速度快&#xff0c;开源的优点 sql是一种结构化查询语言(Structured Query Language)&#xff0c;专门用来管理和处理关系型数据库的标准化编程语言&#xff0c;mysql实现了SQL标准&#xf…...

服务器基础1

服务器基础复习01 1.环境部署 系统&#xff1a;华为欧拉系统 网络简单配置nmtui 因为华为欧拉系统密码需要复杂度 所以我们可以进入后更改密码 echo 123 | passwd --stdin root也可以 echo "root:123" | chpasswd2.关闭防火墙&#xff0c;禁用SElinux 首先先关…...

<数据集>光伏板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2400张 标注数量(xml文件个数)&#xff1a;2400 标注数量(txt文件个数)&#xff1a;2400 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Crack,Grid,Spot] 序号类别名称图片数框数1Crack8688922Grid8248843S…...

leetcode 513. 找树左下角的值

给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个数的范围是 [1,104]-231 < Node.val &…...

C++并发编程实战学习笔记

一、C的并发&#xff1a; 多进程并发&#xff1a; 将应用程序分为多个独立的进程&#xff0c;它们在同一时刻运行&#xff0c;就像同 时进行网页浏览和文字处理一样。独立的进程可以通过进程间常规的通信渠道传递讯息(信号、套接字、文件、管道等等)。不过&#xff0c;这种进程…...

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】 本地事务事务的基本性质事务的隔离级别&#xff08;下面四个越往下&#xff0c;隔离级 别越高&#xff0c;并发能力越差&#xff09;事务的传播行为&#xff08;是否…...

HC05主从一体蓝牙模块的裸机使用——单片机<-->蓝牙模块

HC-05是一种常用的蓝牙模块&#xff0c;具有低功耗、低成本、易于使用的特点。它可以实现与其他蓝牙设备&#xff08;如手机、电脑等&#xff09;进行无线通信。HC-05蓝牙模块具有串口通信接口&#xff0c;可以通过串口与主控制器&#xff08;如Arduino、Raspberry Pi等&#x…...

“点点通“餐饮点餐小程序-计算机毕业设计源码11264

"点点通"餐饮点餐小程序 XXX专业XX级XX班&#xff1a;XXX 指导教师&#xff1a;XXX 摘要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;微信的餐饮点餐小程序更…...

C#知识|账号管理系统-账号信息管理界面[1]:账号分类选择框、Panel面板设置

哈喽,你好啊,我是雷工! 前一节实现了多条件查询后端代码的编写, 接下来继续学习账号信息管理界面的功能编写,本节主要记录账号分类选择框和Panel的设置, 以下为学习笔记。 01 功能说明 本节实现以下功能: ①:账号分类选择框只能选择,无法自由输入; ②:账号分类框默认…...

Meta即将推出4000亿的Llama 3 超级AI模型,或将改写大语言模型竞争格局!|TodayAI

2024年4月&#xff0c;科技巨头Meta发布了其最新的AI大型语言模型——Llama 3&#xff0c;该模型基于一个至少比前代产品Llama 2大七倍的数据集&#xff0c;展现出前所未有的性能。在最初发布时&#xff0c;Llama 3提供了8B和70B两种参数规模的版本&#xff0c;并迅速超越了Goo…...

数据挖掘新技能:Python爬虫编程指南

Python爬虫的优势 Python之所以成为数据爬取的首选语言&#xff0c;主要得益于其丰富的库和框架支持。以下是一些常用的库&#xff1a; Requests&#xff1a;用于发送HTTP请求&#xff0c;简单易用&#xff0c;是Python爬虫的基础库。BeautifulSoup&#xff1a;用于解析HTML文…...

object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...