C++ 中的char型变量

2023-05-16

最简单的字符数据类型是 char 数据类型。该类型的变量只能容纳一个字符,而且在大多数系统上,只使用一个字节的内存。以下示例即声明了一个名为 letter 的 char 变量。请注意,这里的字符常数就是赋给变量的值,要用单引号括起来。

char letter ='A';

下面的程序使用了一个 char 变量和若干字符常数:

//This program uses a char variable and several character literals.
#include <iostream>
using namespace std;
int main()
{
    char letter;
    letter = 'A';
    cout << letter << endl;
    letter = 'B';
    cout << letter << endl;
    return 0;
}
	程序输出结果:
A
B

有趣的是,字符与整数密切相关,因为它们在内部其实是被存储为整数。每个可打印的字符以及许多不可打印的字符都被分配一个唯一的数字。用于编码字符的最常见方法是 ASCII(美国信息交换标准代码的首字母简写)。当字符存储在内存中时,它实际上是存储的数字代码。当计算机被指示在屏幕上打印该值时,它将显示与数字代码对应的字符。

例如,数字 65 对应大写字母 A,66 对应大写字母 B,等等。下面的程序说明了字符之间的关系以及它们的存储方式:

// This program demonstrates that characters are actually
// stored internally by their ASCII integer value.
#include <iostream>
using namespace std;
int main()
{
    char letter;
    letter = 65; // 65 is the ASCII code for the character A
    cout << letter << endl;
    letter = 66; // 66 is the ASCII code for the character B
    cout << letter << endl;
    return 0;
}

程序输出结果:

A
B

图 1 进一步说明,当你认为存储在内存中的是字符(如 A、B 和 C)时,实际上存储的是数字 65、66 和 67。
图 1 字符在内存中是以数字形式保存的
字符常数和字符串常数的区别

字符常数和 char 变量只能保存一个字符。如果要在常数或变量中存储多个字符,则需要使用更复杂的字符数据类型 string(字符串),字符串常数和变量可以包含一系列的字符。

现在,让我们先来认识一下字符串常数,并将它们与字符常数进行一些比较。

在以下示例中,‘H’ 是字符常数,“Hello” 是字符串常数。请注意,字符常数用单引号括起来,而字符串常数则用双引号。

cout << 'H' << endl;  //这显示的是字符常数
cout << "Hello" << endl; //这显示的是字符串常数

因为字符串常数几乎可以是任意长度,所以程序必须有一些方法知道它有多长。在 C++ 中,这是通过在其末尾附加一个额外的字节并将数字 0 存储在其中来完成的。这被称为 null 终止符或 null 字符,它标记着字符串的结尾。

不要将空终止符与字符 ‘0’ 混淆。字符 ‘0’ 的 ASCII 码是 48,而空终止符的 ASCII 码是 0。如果要在屏幕上打印字符 0,则显示的其实是 ASCII 码为 48 的字符;在使用字符串常数或给字符串变量赋值时,ASCII 代码为 0 的字符将自动附加在其末尾。

现在来看一个字符串常数存储在内存中的例子。图 2 描述了字符串 “Sebastian” 的存储方式。
图 2 字符串常数在内存中的存储方式
首先,可以发现字符串中的字符存储在连续的内存位置。其次,可以看到引号不与字符串一起存储,它们只是在源代码中标记字符串的开头和结尾。最后,请注意字符串的最后一个字节,它包含 null 终止符,由 \0 字符表示。最后一个字节意味着虽然字符串 “Sebastian” 的长度为 9 个字符,但它实际占用了 10 个字节的内存。

null 终止符是在后台默默奉献的又一个例子。在显示字符串时,它不会在屏幕上打印,但是它始终在那里默默地做它的工作。需要注意的是,C++ 会自动在字符串常数的末尾附加 null 终止符。

现在来比较一下字符和字符串的存储方式。假设程序中有常数 ‘A’ 和 “A”。图 3 显示了其内部存储方式。
图 3 字符和字符串不同的存储方式
如图 3 所示,‘A’ 是一个 1 字节的元素,而 “A” 是一个 2 字节的元素。由于字符实际上被存储为 ASCII 码,所以图 4 显示了它们在内存中实际存储的内容。
图 4 字符和字符串实际存储的内容
因为 char 变量只能保存一个字符,所以它可以被赋值为字符 ‘A’,但不能被赋值为字符串 “A”:

char letterOne = 'A';   //该赋值语句正确
char letterTwo = "A";  //该赋值语句错误

注意,重要的是不要把字符常数和字符串常数搞混。字符常数必须使用单引号括起来,而字符串常数则必须使用双引号。

现在应该已经了解,有些字符串虽然看起来像是只有一个字符,但实际上并不是。另外,也有一些字符看起来像是字符串,例如换行符 \n,虽然它由两个字符表示,一个反斜杠和一个控制字符 n,但是它在内部其实只表示一个字符。事实上,所有的转义序列在内部都只有 1 个字节。

下面的程序显示了 \n 作为字符常数的用法,用单引号括起来:

//This program uses character literals.
#include <iostream>
using namespace std;
int main()
{
    char letter;
    letter = 'A';
    cout << letter << '\n';
    letter = 'B';
    cout << letter << '\n';
    return 0;
}

程序输出结果:

A
B
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中的char型变量 的相关文章

  • ubuntu中共享文件夹看不到

    博主的ubuntu安装VMwaretools后共享文件夹设置完发现在 mnt hgfs总看不到 经过多次摸索后终于可以了 首先要使用root用户登陆ubuntu 然后再安装VMwaretools 在设置共享文件夹 然后解决挂在的问题 1 设
  • keystore was tampered with,or password was incorrect解决办法

    利用keytool导入证书 xff0c 命令如下 keytool import alias HZZSQKJdianshang file HZZSQKJdianshang cer keystore trust jks storepass st
  • Convert Picture or Video to ascii

    一个利用ascii拼成的谷歌街景地图 xff01 http tllabs io asciistreetview 看上去效果真不错 xff01 除此之外 xff0c linux下面也有类似的ascii艺术 xff0c 比如 aview asc
  • texlive2015-6安装

    http www cnblogs com snake553 p 4831588 html CentOS6 5 下安装 texlive2015 并设置 ctex 中文套装 0 卸载旧版本的 texlive 0 1 卸载 texlive2007
  • ubuntu20.04 安装显卡驱动后开机卡住,无法进入登陆界面问题解决

    ubuntu20 04 安装显卡驱动后开机卡住 xff0c 无法进入登陆界面问题解决 进入recovery mode 禁用nvidia drm systemctl isolate multi user target modprobe r n
  • Linux环境变量失效,命令不可用

    背景 linux在修改完环境变量 etc profile后保存文件后 xff0c 发现大多数命令不可用 xff0c 只有少数如 xff1a cd pwd可以使用 xff1b 原因分析 1 etc profile文件中有无效字符或变量 xff
  • Ubuntu20.04安装MySQL5.7-实测3种方法(保姆级教程)

    最近生产系统系统需要使用MySQL5 7版本的数据库 xff0c 而Ubuntu20 04默认是8 0的版本 xff0c 折腾了一段时间后 xff0c 测试了3中方法 xff0c 在实际应用环境中测试成功 xff0c 因此发布出来给大家参考
  • 数据仓库的源数据类型

    数据仓库中集成了企业几乎所有的可以获取到的数据以用于数据分析和决策支持 xff0c 当然也包括了我在网站分析的数据来源一文中所提到的所有数据 这些进入到数据仓库中的数据无外乎三种类型 xff1a 结构化数据 半结构化数据 和非结构化数据 x
  • soj 1075 拓扑排序队列实现

    就是soj 拓扑排序的模板题吧 然后我中午把用队列实现的拓扑排序的方法看了下 晚上就打算来练一下这种纯模板 对于这实现的方法 xff0c 我的理解就是存下每个节点的入度以及它指向的其他节点 xff0c 由于指向多少个这个不太能确定所以用一个
  • poker

    include lt stdbool h gt include lt stdio h gt include lt stdlib h gt define NUM RANKS 13 define NUM SUTTS 4 define NUM C
  • vue实现筛选动态配置

    lt el form class 61 34 cellStyleForm 34 model 61 34 queryParams 34 ref 61 34 queryForm 34 v show 61 34 showSearch 34 inl
  • C. Good String Codeforces Round #560 (Div. 3)

    C Good String time limit per test 1 second memory limit per test 256 megabytes input standard input output standard outp
  • v4l2接口解析和摄像头数据采集

    V4L2接口解析 操作步骤 应用程序通过V4L2接口采集视频数据步骤 打开视频设备文件 xff0c 通过视频采集的参数初始化 xff0c 通过V4L2接口设置视频图像属性 申请若干视频采集的帧缓存区 xff0c 并将这些帧缓冲区从内核空间映
  • 阿里云cdn缓存命中查看

    我们在使用阿里云想知道CDN缓存命中 命中Hit X Cache HIT TCP MEM HIT dirn 9 435942540 上面的情况是命中的情况 不命中的情况miss X Cache MISS TCP MISS dirn 2 2
  • ffmpeg解码RTSP/TCP视频流H.264(QT界面显示视频画面)

    源码下载地址 http download csdn net detail liukang325 9489952 我用的ffmpeg版本为 ffmpeg 2 1 8 tar bz2 版本低了恐怕有些头文件和API找不到 在Linux下解压后编
  • vue的script代码

  • C++扑克牌类的设计

    C 43 43 扑克牌 1 设计扑克类Card xff1a 主要属性有花色和点数 xff1b 主要方法有初始化 输出 比较大小等 2 设计一副扑克牌类Cards xff1a 主要属性包括扑克对象数组 xff1b 主要方法有初始化 洗牌 输出
  • 用Linux系统做路由器

    一 网络结构如下 Internet nbsp nbsp nbsp nbsp nbsp 路由器A Lan 192 168 1 1 nbsp nbsp nbsp nbsp Linux路由器 eth0接路由器A IP 192 168 1 2 网关
  • rust 学习笔记

    按照菜鸟教程 xff1a Rust 教程 菜鸟教程 安装成功了 xff0c 可以跑通第一个程序 中间有一些插曲 xff0c 比如报了 error linker 96 link exe 96 not found 这个错误 输入 xff1a r
  • Rust:axum学习笔记(4) 上传文件

    Rust axum学习笔记 4 上传文件 上传文件是 web开发中的常用功能 xff0c 本文将演示axum如何实现图片上传 xff08 注 xff1a 其它类型的文件原理相同 xff09 xff0c 一般来说要考虑以下几个因素 xff1a

随机推荐