C++学习笔记一: 变量和基本类型

        本章讲解C++内置的数据类型(如:字符、整型、浮点数等)和自定义数据类型的机制。下一章讲解C++标准库里面定义的更加复杂的数据类型,比如可变长字符串和向量等。

1.基本内置类型

        C++内置的基本类型包括:算术类型和空类型。算术类型值:字符、整型数、布尔值和浮点数;空类型对对应具体的值,仅用void表示用在一些特俗场合,比如函数不返回任何值时,就使用void作为返回类型。

1.1算术类型

        算术类型分类整型和浮点型。

        各算术类型在不同机器上表示的数字范围不一样,C++规定了最小取值范围,但最大没有规定。下面图表示各算术的类型的最小取值范围:

C++:算术类型
类型含义最小尺寸
bool布尔类型未定义
char字符8位
wchar_t宽字符16位
char16_tUnicode字符16位
char32_tUnicode字符32位
short短整型16位
int整型16位
long长整型32位
long long长整型64位
float单精度浮点数6位有效数字
double双精度浮点数10位有效数字
long double扩展精度浮点数10位有效数字

        其中:char的大小为一个字节,用于存放英语体系里面的任意字符;布尔类型的取值是真(true)或假(false);

内置类型的机器实现:

        计算机按照二进制序列连续存储数据,每个bit非0即1,例如:

        00001011110110101101011100001111......

        只有将连续的一段bit规定为一个单位,二进制数据才有意义。C++规定,一个字节至少要能容纳机器中基本字符的所有字符。所以,一个字节有8位bit组成,一个字由32或64位bit组成。

        由此,计算机中每8个bit使用1个地址,如下所示:

地址数据
736424 1      0     1     0     0     1     1     0
7364251     0     0     1     0     0     0    1
7364261     1     1     0    1     1     1     0
7364270      1     1     0     0     0     0    1

        数据类型决定了某个具体数据所占的比特数以及这些比特位上数字的含义。

        浮点型在C++中,被指定了最小有效位数,但是大多数编译器都实现了更高的精度。

1.2带符号类型和无符号类型

        除布尔型和扩展的字符型以外,其他整型可以划分为带符号(signed)和无符号(unsigned)的两种类型。带符号类型可以表示正数、负数或0;无符号类型仅能表示正数或0,写法如下:

        unsigned int、unsigned long、unsigned char。

        如果int、short、long和long long没有表示是否带符号,则默认是带有符号的,可以表示负数。

        注意:浮点型是不能用unsigned和signed修饰的。

        C++在类型的规定上有如此多的类型和规定,就是为了尽可能接近硬件,满足各种硬件的特性,所以显得有些繁杂。

注意:

        切勿混用带符号类型和无符号类型,否则发生错误,运算结果无意义。

1.3类型转换

        数据类型的的定义,决定了能包含的数据范围和运算。但是当代码中值与数据类型不匹配时,C++会进行自动数据类型转换。        

bool b = 42                // b为真
int i = b;                 // i的值为1
i = 3.14;                  // i的值为3
double pi = i;             // pi的值为3.0

        把非布尔值赋值给布尔类型,0表示false,非0表示true;

        把布尔值赋值给非布尔类型,false表示0,true表示1;

        浮点数赋值给整型,仅保留整数部分;

        整数赋值给浮点数,小数部分为0。如果整数过大,超过浮点类型容量,真数据失真;

1.4字面值常量

        每种数据类型的值,可以在程序中直接写出,被称作字面常量,比如:42。

        每个字面常量都对应一种数据类型,其形式和值决定了它的数据类型。

  • 整型和浮点型字面值

        数字可以是十进制、八进制、十六进制,为了区分这几种字面常量的不同,八进制和十六进制需要加前缀符号0和0X、0x,如下:

        20 十进制                       024 八进制                  0x24十六进制                       0X24十六进制

        数字的字面常量,C++会以数字的大小,找到最小限度能装下该字面常量的数据类型与之匹配。整型经常是int型,但int装不下时,可能是long型;浮点型经常默认是double型。

  • 字符和字符串字面值

        字符字面值由单引号括起来,且只能写一个字符,比如'C';

        字符串字面值由双引号括起来,里面可以写很多字符,本质上是由每一个字符所组成的数组,并以空字符('\0')表示结尾。所以,即使字符串里面只有一个字符,比如“C”,依然长度是两个字符,字符'C'和空字符。

        两个字符串字面值写在一起,哪怕中间有空白字符(空格符、缩进符、换行符),也被C++认为是一个字符串,所以当书写较长的字符串时,一行不合适,可以分为两个字符串放在两行。

  • 转义序列

        在字符串中,有两类字符不能直接使用,必须使用转义字符进行转义后才能使用。这两类字符是:

        1.不可打印的字符,如退格、换行、空格或其它控制字符,因为没有可视化的符号;

        2.在C++中有特殊含义的字符,如单引号、双引号、反斜杠、问号。

        C++中转义字符如下:

换行符                        \n问号                        \?
纵向制表符                \v进纸符                        \f
反斜杠                        \\报警符                        \a
回车                        \r双引号                        \"
横向制表符                \t单引号                        \'
退格符                        \b

        还有一种泛化的转义字符:格式1为:"\1到3个8进制数字";格式2为:“\x1到多个十六进制数字”,比如:

        \7 响铃        \12 换行符        \40 空格        \0 空字符        \115 字符M        \x4d 字符M

  • 指定字面值的类型

        通过给字面值加上指定前缀和后缀,可以强制规定字面值的数据类型;

字符和字符串字面值的前缀
前缀含义类型
uUnicode 16位字符chart16_t
UUnicode 32位字符chart32_t
L宽字符wchar_t
u8UTF-8(仅用于字符串字面常量)char
整型字面值的后缀
后缀最小匹配类型
u 或者 Uunsigned
l 或者 Llong
ll 或者 LLlong long
浮点型字面值的后缀
后缀类型
f 或者 Ffloat
l 或者 Llong double
  • 布尔字面值和指针字面值

        布尔类型的字面值是:true和false;

        指针字面值是:nullptr。

2.变量

        变量是一个有名称的、可供程序操作的存储空间。C++中的每个变量都有其数据类型,数据类型决定了变量所占内存空间的大小和布局方式、能存储的值的范围,以及变量能够参与的运算规则。

2.1变量的定义

        变量定义的基本格式是:

数据类型说明符 变量名1, 变量名2, 变量名3 ...... ;

int a = 0, b, c=0; // a 和 c初始化了,b仅仅只是定义了
  • 初始值

        当变量获取第一个值的时候,称为初始化。初始化的值可以是任意形式:字面值常量、表达式结果、函数返回值等。

        一条语句中初始化多个变量,前面的变量可以马上为后面的变量初始化。

double a = 0.1, b = a; // a 和 b的值都是0.1

注意:

初始化不是赋值,初始化的含义是创建变量时规定一个最初的值,而赋值是把变量当前的值擦除,用一个新的值代替。二者在内存中的操作动作不一样。

  • 列表初始化

        在C++ 11中引入,用花括号或括号初始化变量,如下都是正确的:

// 以下变量值都是0
int a = 0;
int b = {0};
int c{0};
int d(0);

其中,花括号的形式逐渐流行,无论初始化还是赋值,都可以使用花括号。

  • 默认初始化

        如果定义变量时没有初始化,则变量被默认初始化,给赋予默认值。如果在函数体的变量没有初始化,则默认为0;如果在函数体内,如果变量没有初始化且没有赋值,则该变量值不可控,所以函数体内的变量一定要初始化或赋值。

2.2变量声明和定义的关系

3.复合类型

4.const限定符

5.处理类型

6.自定义数据结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/92742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进阶指针(四)—— 加强对指针,数组名,sizeof,strlen的理解

✨博客主页:小钱编程成长记 🎈博客专栏:进阶C语言 🎈推荐相关博文:进阶C语言(一)、进阶C语言(二)、进阶C语言(三) 进阶指针(四&#x…

QT:绘图

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> //绘图事件class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent 0);~Widget();void paintEvent(QPaintEvent *event); //重写绘图事件void timerEve…

GD32F10X ----RTC

1. RTC的简介 STM32 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置…

格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断(Python代码,CNN模型)

1.运行效果&#xff1a;格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断&#xff08;Python代码&#xff0c;CNN模型&#xff09;_哔哩哔哩_bilibili 环境库 只要tensorflow版本大于等于2.4.0即可运行 2.GAF的内容 GAF是一种用于时间序列数据可视化和特征提…

LLM-TAP随笔——大语言模型基础【深度学习】【PyTorch】【LLM】

文章目录 2.大语言模型基础2.1、编码器和解码器架构2.2、注意力机制2.2.1、注意力机制&#xff08;Attention&#xff09;2.2.2、自注意力机制&#xff08;Self-attention&#xff09;2.2.3、多头自注意力&#xff08;Multi-headed Self-attention&#xff09; 2.3、transforme…

Leetcode 2871. Split Array Into Maximum Number of Subarrays

Leetcode 2871. Split Array Into Maximum Number of Subarrays 1. 解题思路2. 代码实现 题目链接&#xff1a;2871. Split Array Into Maximum Number of Subarrays 1. 解题思路 这一题实现上其实还是比较简单的&#xff0c;就是一个贪婪算法&#xff0c;主要就是思路上需要…

【未解决问题】opencv 交叉编译 ffmpeg选项始终为NO

opencv 打不开视频的原因 在交叉编译时候&#xff0c;发现在 pc 端能用 opencv 打开的视频&#xff0c;但是在 rv1126 上打不开。在网上查了很久&#xff0c;原因可能是 ffmpeg 造成的。 解决opencv源代码编译找不到ffmpeg-CSDN博客 交叉编译 ffmpeg 尝试了一天还是第二个博客…

Linux编程——经典链表list_head

1. 关于list_head struct list_head是Linux内核定义的双向链表&#xff0c;包含一个指向前驱节点和后继节点的指针的结构体。其定义如下&#xff1a; struct list_head {struct list_head *next, *prev; //双向链表&#xff0c;指向节点的指针 };1.1 链表的定义和初始化 有两…

XML-Based Configuration Beans for Ioc Container

XML-Based Configuration XML-based configuration is the traditional way of configuring beans in Spring. <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"h…

【C++】笔试训练(三)

目录 一、选择题二、编程题1、字符串中找出连续最长的数字串2、数组中出现次数超过一半的数字 一、选择题 1、以下程序的输出结果是&#xff08;&#xff09; #include <stdio.h> int main() {char a[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, * p;int i;i 8;p a i;p…

【Java】方法重写

概述 子类中出现了和父类一模一样的方法 当子类需要父类的功能&#xff0c;而功能主体中&#xff0c;子类有自己独特的内容&#xff0c;就可以通过重写父类中的方法&#xff0c;这样即延续了父类的功能&#xff0c;又定义了自己的特有内容 Override 是一个注解&#xff0c;可以…

【JVM】双亲委派模型

双亲委派模型 1. 什么是双亲委派模型2. 双亲委派模型的优点 1. 什么是双亲委派模型 提到 类加载 机制&#xff0c;不得不提的一个概念就是“双亲委派模型”。 双亲委派模型指的就是 JVM 中的类加载器如何根据类的全限定名找到 .class 文件的过程 类加载器: JVM 里面专门提供…

【ESP32 + Edge Impulse平台】运行AI算法模拟多传感器数据融合实现异常检测

本篇博文主要以ESP32+MQ Sensor 气体传感器为例,通过连接 Edge Impulse 平台,实现数据的实时采集和训练,进而实现在嵌入式设备上部署 ML 机器学习。本教程介绍如何使用 Edge Impulse 和机器学习来实现ESP32 异常检测系统,系统使用一个机器学习模型,检测气体何时出现异常。…

OpenCV查找和绘制轮廓:findContours和drawContours

1 任务描述&#xff1a; 绘制图中粗线矩形的2个边界&#xff0c;并找到其边界的中心线 图1 原始图像 2.函数原型 findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, …

移动端 [Android iOS] 压缩 ECDSA PublicKey

移动端 [Android & iOS] 压缩 ECDSA PublicKey AndroidiOS 使用 Android KeyStore 和 iOS 的 Secure Enclave 提供的安全能力使用 P-256 来对 API 请求进行签名&#xff0c;服务器端再进行验证。 但是发现不论是 iOS 还是安卓都没有提供一个便捷的方式从 iOS 的SecKeyCopyE…

0/1背包问题

例题HDU-2602 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag wi…

2021-06-11 51蛋骗鸡用小数点作秒指示,分钟计时.(怎么用二个数码管做分的倒计时,DP亮灭来计秒)

缘由怎么用二个数码管做分的倒计时&#xff0c;DP亮灭来计秒,求思路 - 24小时必答区 #include "REG52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; sbit BUZ1P1^0; bit k0; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128};//0-9. unsign…

RPC协议

问题一&#xff1a;如何规定远程调用的语法&#xff1f;客户端如何告诉服务端&#xff0c;我是一个加法&#xff0c;而另一个是乘法。我是用字符串“add”传给你&#xff0c;还是传给你一个整数&#xff0c;比如 1 表示加法&#xff0c;2 表示乘法&#xff1f;服务端该如何告诉…

mysql json字段使用以及常用json函数,配合springBoot和mybatis-plus简化开发

Mysql JSON 类型分享 Mysql json字段了解&#xff1a; MySQL 中的 JSON 类型是一种用于存储和处理 JSON&#xff08;JavaScript Object Notation&#xff09;数据的数据类型。JSON 是一种轻量级的数据交换格式&#xff0c;常用于表示结构化的数据。MySQL 的 JSON 类型提供了以…

Fragment之间进行通信的最佳实现方式

前言 在Android应用程序中&#xff0c;片段&#xff08;Fragments&#xff09;是一种组件&#xff0c;用于构建灵活且可重用的用户界面。然而&#xff0c;当在应用程序中使用多个片段时&#xff0c;它们之间的通信变得非常重要。本文将介绍在Android应用程序中实现片段之间和片…