三、C++学习笔记——处理数据

本文介绍了C++中的基本类型,包括整型(short、int、long、long long及其无符号版本)和浮点数(float、double、long double)。详细阐述了变量命名规则、类型选择、字面值表示、类型转换以及算术运算。此外,还探讨了const限定符和bool类型的使用。示例代码展示了如何通过sizeof运算符检查类型大小,以及如何在不同进制中显示数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

内置的C++类型分两组:基本类型和复合类型。本章将介绍基本类型,即整数和浮点数。似乎只有两种类型,但C++知道,没有任何一种整型和浮点型能够满足所有的变成要求,因此对于这两种数据,它提供了多种变体。第四章将介绍在基本类型的基础上创建的复合类型,包括数组、字符串、指针和结构体。

当然,程序还需要一种表示存储的数据的方法,本章将介绍这样一种方法——使用变量;然后介绍如何在C++中如何进行算术运算;最后,介绍C++如何将值从一种类型转换为另一种类型。

3.1 简单变量

3.1.1 变量名

C++命名规则:

1.在名称中只能使用字母字符、数字和下划线

2.名称的第一个字符不能是数字

3.区分大小写

4.不能使用C++关键字

5.C++本身对名称长度无限制,但有些平台有长度限制

6.以两个下划线或下划线和大写字母大头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。

3.1.2 整型

整数就是没有小数部分的数字。术语宽度(width)用于描述存储整数时使用的内存量。使用的内存越多,则越宽。C++的基本整形分别是char、short、int、long和longlong,其中每种类型都有有符号版本和无符号版本,因此共有10种类型可供选择。由于char类型有一些特殊属性(它最常用来表示字符,而不是数字),因此本章将先介绍其他类型。

3.1.3 整型short、int、long和longlong

// some integer limits
#include <iostream>
#include <climits>
int main() {
	using namespace std;
	int n_int = INT_MAX;
	short n_short = SHRT_MAX;
	long n_long = LONG_MAX;
	long long n_llong = LLONG_MAX;

	cout << "int is " << sizeof(int) << " bytes." << endl;
	cout << "short is " << sizeof(n_short) << " bytes." << endl;
	cout << "long is " << sizeof(n_long) << " bytes." << endl;
	cout << "long long is " << sizeof n_llong << " bytes." << endl;

	cout << "maximums:" << endl;
	cout << "int: " << n_int << endl;
	cout << "short: " << n_short << endl;
	cout << "long: " << n_long << endl;
	cout << "long long: " << n_llong << endl;

	cout << "Bits per byte = " << CHAR_BIT << endl;
	return 0;
}

1. 运算符sizeof和头文件limits

可对类型名或变量名使用sizeof运算符。对类型名(如int)使用sizeof运算符时,应将名称放在括号中;但对变量名使用该运算符时,括号时可选的。

2. 初始化

在声明变量时同时完成赋值,即为初始化(等号初始化,大括号初始化器)。

C++还有一种C语言没有的初始化语法:

3. C++11初始化方式

还有另一种初始化方法(大括号初始化器),这种方式用于数组和结构,但在C++98中,也可用于单值变量:

3.1.4 无符号类型

优点是增大变量能够存储的最大值。当然,晋档数值不会为负时才应使用无符号类型,如人口、粒数。要创建无符号版本的基本整形,只需使用关键字unsigned来修改声明即可:

3.1.5 选择整型类型

3.1.6 整形字面值

整型字面值(常景)是显式地书写的常最,如212或1776。

// display values in hex and octal

# include <iostream>
int main() {
	using namespace std;
	int a = 42;
	
	cout << "\ta in dec: " << a << endl;
	cout << hex << "\ta in hex: " << a << endl;
	cout << oct << "\ta in oct: " << a << endl;

	return 0;
}

如若cout << hex;等代码,则屏幕上不会显示任何内容,而只是修改cout显示整数的方式。因此,控制符hex实际上是一条消息,告诉cout采取何种行为。另外,标识符hex位于名称空间std中,而程序使用了该名称空间,因此不能用hex做变量名。然而,如果省略编译指令using,而是用std::hex,则可以使用hex做变量名。

// display values in hex and octal

# include <iostream>
int main() {
	using std::cout;
	using std::endl;
	int hex = 42;
	
	cout << "\thex in dec: " << hex << endl;
	cout << std::hex << "\thex in hex: " << hex << endl;
	cout << std::oct << "\thex in oct: " << hex << endl;

	return 0;
}

3.1.7 C++如何确定常量的类型 P64

除非有理由存储为其他类型(如使用了特殊的后缀来表示特定的类型,或者值太大,不能储存为int),否则C++将整形常量存储为int类型。

对于不带后缀的十六进制或八进制整数,将使用下面儿种类型中能够存储该数的最小类型来表示: int、 unsigned int long、 unsigned long、 long long 或 unsigned long long。 在 将4294967295表示为long long的计算机系统中,十六进制数0xffff_ffff (4294967295)将被表示为unsigned long。这是因为十六进制常用来表示内存地址,而内存地址楚没有符号的,因此,unsigned long比long long更适合用来表示 1 6位的地址。

代码:

/*
功能:查看整形常量后缀对常量类型的影响
*/
#include <iostream>

int main() {
	using namespace std;

	cout << "4000: " << sizeof 4000 << endl;
	cout << "4000L: " << sizeof 4000L << endl;
	cout << "4000LL: " << sizeof 4000LL << endl;
	cout << "int: " << sizeof (int) << endl;
	cout << "long: " << sizeof(long) << endl;
	cout << "long long: " << sizeof(long long) << endl << endl;

	cout << "4294967295: " << sizeof 4294967295 << endl;
	cout << "0xffff_ffff: " << sizeof 0xffffffff << endl;
    // 4294967295 == 0xffffffff 
	return 0;
}

输出:

4000: 4
4000L: 4
4000LL: 8
int: 4
long: 4
long long: 8

4294967295: 8
0xffffffff: 4

3.1.8 char类型:字符和小整数

C++对字符用单引号,对字 符串使用双引号。cout对象能够处理这两种情况,但正如第4 章将讨论的,这两者有天壤之别。最后,程序引入了cout的一项特性— cout.put()函数,该函数显示一个字符。

// 用cout.put()输出一个字符
#include <iostream>
int main() {
	using namespace std;
	cout.put('!');
	cout << endl;

	char ch = 'M';
	int i = 'M';
	cout << "ch = " << ch << endl;
	cout << "i = " << i << endl;

	ch = 78;
	i = 78;
	cout << "ch = " << ch << endl;
	cout << "i = " << i << endl;

	cin >> ch;	// input 5
	i = ch;
	cout << "ch = " << ch << endl;
	cout << "i = " << i << endl;
	return 0;
}

输出:

!
ch = M
i = 77
ch = N
i = 78
5(input)
ch = 5
i = 53

1.程序说明

‘M ’ 表示字符M的数值编码,因此将 char 变量 ch 初始化为 ‘M ’ ,将把 ch 设置为77。然后,程序将同样的值赋给int变量 i , 这 样 ch 和 i 的值都是77。接下来,cout把ch显示为M,而把 i 显示为77。如前所述,值的类型将引导cout选择如何显示值——这是智能对象的另一个例子。

同样,直接将 ch 和 i 的值设置为78,则cout根据值的类型ch显示为N,而把 i 显示为78。

通过键盘输入的数字也被视为字符。所以输入5并按回车键,代码将读取字符“5”,并将其对应的字符编码(53)存储到ch中。随后将ch的值赋给 i 。接下来,cout把ch显示为5,而把 i 显示为53。

2.成员函数cout.put()

put()是ostream的一个成员函数。成员函数归类所有,描述了操纵类数据的方法。

例如类ostream有一个put()成员函数,用来输出字符。只能通过类的特定对象(例如这里的 cout 对象)来使用成员函数。要通过对象(如 cout )使用成员函数,必须用句点将对象名和函数名称(put() ) 连接起 来。句点被称为成员运算符。cout.put()的意思是,通过类对象 cout 来使用函数 put()。

3.char字面值

在C++中,书写字符常量的方式有多种。对于常规字符(如字母、标点符号和数字),最简单的方式是将字符用单括号括起。这种表示法代表的是字符的数值编码。

  • 'A'为65,即字符A的ASCII码

这种表示法优于数值编码,它更加清晰,且不需要知道编码方式。如果系统使用的是EBCDIC,则A的编码将不是65,但是'A'表示的仍然是字符A。

有些字符不能直接通过键盘输入到程序中。例如,按回车键并不能使字符串包含一个换行符;相反, 程序编辑器将把这种键击解释为在源代码中开始新的一行。其他一些字符也无法从键盘输入,因为 C++语言陚予了它们特殊的含义。例如,双引号字符用来分隔字符串字面值,因此不能把双引号放在字符串字面值中。对于这些字符,C++提供了一种特殊的表示方法——转义序列。

注意,应该像处理常规字符(如 Q ) 那样处理转义序列(如\n )。也就是说,将它们作为字符常最时, 应用单引号括起:将它们放在字符串中时,不要使用单引号。

4.通用字符名

通用字符名的用法类似于转义序列。通用字符名可以以\ u 或\U打头。\ u 后面是 8 个十六进制位, \U 后面则足1 6个十六进制位。这些位表示的是字符的ISO 10646码 点 (ISO 10646是一种正在制定的国际标准,为大量的字符提供了数值编码,请参见本章后面的“ Unicode和 ISO 10646”)。

cout << "Let them eat g\u00E2teau. \n";

\hat{a}的码点为00E2。因此,上述 C++代码将变景名设置为k\hat{a}rper,并显示下面的输出: Let them eat g\hat{a}teau.

如果系统不支持 ISO 10646,\u00E2将被显示其他字符,而不是5。 实际上,从易读性的角度看,在变虽名中使用\u00E2没有多大意义,但如果实现的扩展源字符集包含\hat{a}, 它可能允许您从键盘输入该字符。

W注意,C++使用术语 “ 通用编码名”,而不是 “ 通用编码”,这是因为应将\u00E2解 释 为 “ Unicode 码点为U-00F6的字符”。支 持 Unicode的编译器知道,这表示字符\hat{a},但无需使用内部编码00F6。无论计算机使用是ASCII还是其他编码系统,都可在内部表示字符T;同样,在不同的系统中,将使用不同的编码来表示字符G。在源代码中,可使用适用于所有系统的通用编码名,而编译器将根据当前系统使用合适的内部编码来表示它。

5.signed char和unsigned char

与 int 不同的是,char在默认情况下既不是没有符号,也不是有符号。是否有符号由C++实现决定, 这样编译器开发人员可以最大限度地将这种类型与硬件属性匹配起来。如 果 char 有某种特定的行为对您来说非常重要,则可以显式地将类型设置为 signed char 或 unsigned char。

6.wchar_t

wchar_t是一种生疏类型,它有足够的空间,可以表示系统使用的最大扩展字符集。对底层类型的选择取决于实现,因此在一个系统中,他可能是unsigned short,而在另一个系统中,则可能是int。

cin 和 cout 将输入和输出看作是char流,因此不适于用来处理 wchar_t 类型。iostream 提供了作用类似的工具—— wcin 和wcout,可用于处理 wchar_t 流。另外,可以通过加上前缀L来指示款字符常量和宽字符串。

wchar_t bob = L'p';        // a wide-character constant
wcout << L"tall" << endl;// outputting a wide-character string

3.1.9 bool类型

字面值true和false都可以通为过提升转换为int类型,true转1,false转0

任何数字值或指针都可以被隐式转换(即不用显式强制转换)为bool值。任何非零值都可被转为true,而零被转换为false。

 

3.2 const限定符

创建常量的通用格式如下

const type name = value;
// 注意,应在声明时初始化。下面的代码不好:
const int toes;
toes = 10;         // too late
如果声明常量是没有提供值,则该常量的值将是不确定的,且无法修改。   

3.3 浮点数

浮点数表示的范围更大,但浮点运算的速度比整数运算慢,且精度将降低。

3.3.1 书写浮点数

12.34        // 标准小数点表示法
123400e-4    // E表示法

3.3.2 浮点类型

float, double, long double

3.3.3 浮点常量

默认情况下,浮点常量都属于double类型。如果希望常量为float类型,可以使用 f 或 F 后缀,对于long double类型,可使用 l 或 L 后缀。

1.23f
1.23F
1.23L

 

3.4 C++算术运算符

5中基本算术运算:加减乘除求模

强制类型转换:

C 类型:
(typeName) value
typeName (value)
C++ 类型:
static_cast<typeName> (value)    // return a type long conversion of value

auto

如果使用关键字auto,而不指定变量的类型,编译器将把变量的类型设置为与初始值相同。



3.5 总结

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值