【C++】C++ 语言对 C 语言的加强 ③ ( 类型检查增强 - 所有函数和变量必须有类型 | 新增 bool 类型 - bool 类型简介 )

2023-08-19 21:43:32





一、类型检查增强 - 所有函数和变量必须有类型




1、C 语言函数类型 - 函数参数与返回值类型可以不确定


在 C 语言中 , 函数的返回值类型在定义时可以不写明 , 函数参数如果为空 , 可以任意传入参数 , 也不会报错 ;

下面的代码中 , 函数 f 没有返回值类型 , 也没有注明参数类型 , 接收参数后 , 仍然能正常打印出参数 ;

函数 num 没有注明返回值类型 , 但是可以返回 整型数值 1 , 函数参数为空 , 但是向函数中传入若干参数 , 也不会报错 ;


代码示例 :

#include <stdio.h>

// 函数中参数没有写明类型
// 也没有写返回值
f(i)
{
	printf("i = %d \n", i);
}

// 函数没有参数, 可以传入任意参数
// 函数没有返回值类型, 但是可以返回返回值
num()
{
	return 1;
}

int main()
{
	f(10);
	printf("num = %d \n", num(1, 2, 3));
	return 0;
}

执行结果 : 使用 gcc 编译器编译上述 C 语言源代码 , 然后执行编译结果 a.exe , 发现可以编译通过 , 并能成功执行 ;

C:\Users\octop\Desktop>gcc hello.c

C:\Users\octop\Desktop>a.exe
i = 10
num = 1

在这里插入图片描述


2、C++ 语言函数类型 - 函数参数与返回值类型必须写明


在 C++ 语言中 , 所有的 变量 和 函数 , 都必须有类型 ;

将上述 C 语言中的代码拷贝到 C++ 环境中 , 然后再次进行编译 , 发现一堆报错 ;

1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Hello.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(5,3): error C2065: “i”: 未声明的标识符
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(5,4): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(6,1): error C2448: “f”: 函数样式初始值设定项类似函数定义
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(13,1): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(19,2): error C2064: 项不会计算为接受 1 个参数的函数
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(20,35): error C2660: “num”: 函数不接受 3 个参数
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(12,1): message : 参见“num”的声明
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(20,9): warning C4473: “printf”: 没有为格式字符串传递足够的参数
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(20,9): message : 占位符和其参数预计 1 可变参数,但提供的却是 0 参数
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(20,9): message : 缺失的可变参数 1 为格式字符串“%d”所需
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

在这里插入图片描述





二、新增 bool 类型 - bool 类型简介



C 语言中没有布尔值的概念 , 只有 0 和 1 的概念 , 使用 int 类型 + 宏定义 的形式表示布尔值 , 如下代码所示 ;

// 使用 宏定义 定义布尔类型
#define BOOL int
#define TRUE 1
#define FALSE 0

// 使用 宏定义 定义一个布尔变量
BOOL flag = FALSE;

C++ 语言在 C 语言的基础之上 , 新增了 布尔类型 , 类型名称是 bool ;


bool 布尔类型取值 : 取值有两个 true 和 false ;

  • true 表示真 , 在 编译器 内部使用 1 表示 ; 如果为 bool 变量赋值 非 0 的数值 ( 包括负数 ) , 会转为 true ;
  • false 表示假 , 在 编译器 内部使用 0 表示 ; 如果为 bool 变量赋值 0 , 会转为 false;

bool 布局类型占用内存空间 :

  • 一般情况下 , bool 类型变量 占用内存空间大小 1 字节 ;
  • 如果多个 bool 类型变量一起定义 , 编译器编译时会进行优化 , 每个 bool 变量占 1 位 , 也就是 1 bit , 8 bit 是 1 字节 Byte ;

下面的代码中 , 打印了 bool 类型变量的大小 1 字节 ;

  • 为 bool 类型变量赋值 非 0 的数值 , 都会被转为 true ;

  • 为 bool 类型变量赋值 0 , 才会被转为 false ;

代码示例 :

// 导入标准 io 流头文件
// 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

void main()
{
	// 声明 bool 变量
	bool b = true;
	// 打印 bool 变量的大小
	cout << "sizeof(b) : " << sizeof(b) << endl;
	// 打印 bool 变量的值
	cout << "b : " << b << endl;

	// 1. 为其赋值 10 会被当做 1 值为 true
	b = 10;
	// 打印 bool 变量的值
	cout << "b : " << b << endl;

	// 2, 为其赋值 -1 会被当做 1 值为 true
	// 负数也会被当做 1 , 转为 true
	b = -1;
	// 打印 bool 变量的值
	cout << "b : " << b << endl;

	// 3. 为其赋值 0 会被当做 0 值为 false
	b = 0;
	// 打印 bool 变量的值
	cout << "b : " << b << endl;

	system("pause");
}

执行结果 :

sizeof(b) : 1
b : 1
b : 1
b : 1
b : 0
请按任意键继续. . .

在这里插入图片描述

更多推荐

分布式运用之rsync远程同步

一、rsync的相关知识1.1rsync简介rsync(RemoteSync,远程同步)是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。rsync的官方站点的网址是rsync.samba.or

ubuntu搭建sftp服务

安装OpenSSH服务器Ubuntu通常已经预装了OpenSSH客户端,但如果您还没有OpenSSH服务器,请在终端中执行以下命令来安装:sudoaptupdatesudoaptinstallopenssh-server创建SFTP用户和组创建一个新的用户组(例如sftp_users),用于管理SFTP用户:sudog

Linux之shell条件测试

目录作用基本用法格式:案例-f用法[]用法[[]]用法(())语法文件测试参数案例编写脚本,测试文件是否存在,不存在则创建整数测试作用操作符案例系统用户个数小于50的则输出信息逻辑操作符符号案例命令分隔符案例分析案例1---判断当前已登录的账户数,超过5个则输出信息案例2---取出/etc/passwd文件的第6行内容

Layui快速入门之第十四节 分页

目录一:基本用法API渲染属性二:自定义主题三:自定义文本四:自定义排版五:完整显示一:基本用法分页组件laypage提供了前端的分页逻辑,使得我们可以很灵活处理不同量级的数据,从而提升渲染效率<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>分页</title

STM32低功耗分析

1.ARM发布最新内核2023年5月29日,Arm公司今天发布了处理器核心:Cortex-X4、Cortex-A720和Cortex-A520。这些核心都是基于Armv9.2架构,只支持64位指令集,不再兼容32位应用。Arm公司表示,这些核心在性能和效率方面都有显著的提升,同时也加强了安全性和可扩展性。Cortex-

字符串相似度算法

相似度算法JaccardSimilarityCoefficient、JaroWinkler、CosineSimilarity、Levenshtein距离编辑算法案例。Jaccard相似性系数衡量两个集合的相似程度,通过计算两个集合的交集大小除以并集大小得出。适用于处理文本、推荐系统、生物信息学等领域CosineSimi

青龙面板从0到1的实现

文章目录需要有一台云服务器Docker、SSH、青龙如何打开云服务器上的青龙面板青龙注册登录看这个青龙配置最后、从此需要有一台云服务器我这里选择的是阿里云新用户免费送的三个月服务器,服务器操作系统:CenOS(其他操作系统也可以:Ubantu、Debian)。Docker、SSH、青龙为云服务器系统安装Docker容器

支付功能、支付平台、支持渠道如何测试?

有学员提问:作为一个支付平台,接入了快钱、易宝或直连银行等多家的渠道,内在的产品流程是自己的。业内有什么比较好的测试办法,来测试各渠道及其支持的银行通道呢?作为产品,我自己办了十几张银行卡方便测试,但QA和开发不愿意这样做,怎么办呢?回答:对支付平台而言,与支付渠道相关的测试大致可以分为:测试支付渠道功能、测试支付产品

scons体验以及rtthread中的简单使用

SCons是一个用于构建软件项目的软件构建工具。它使用Python脚本作为配置文件,提供了一种简单而灵活的方式来描述软件项目的构建过程。下面是一个简单的SCons使用示例:安装SCons:首先,确保你已经安装了Python。然后,可以使用Python的包管理器pip安装SCons。在命令行中运行以下命令安装SCons:

【谢希尔 计算机网络】第2章 物理层

目录通信基础基本概念两个公式lim奈氏准则香农定理奈氏准则VS香农定理编码与调制​编辑物理层下面的传输媒体导引型传输媒体1.双绞线2.同轴电缆3.光缆非导引型传输媒体无线电微波通信卫星通信无线局域网使用的ISM频段信道复用技术频分复用、时分复用和统计时分复用波分复用码分复用CDMA工作原理CDMA的重要特点数字传输系统

01Spring的Ioc思想和依赖注入手段(DI)

传统方式创建对象的缺陷连接MySQL实现登录功能控制层UserControllerpublicclassUserController{//多态,半面向接口编程privateUserServiceuserService=newUserServiceImpl();publicvoidlogin(){Stringuserna

热文推荐