第三章 处理数据
3.1. 简单变量
3.1.1. 变量名
命名规则:
- 在名称中只能使用字母字符、数字和下划线(_)。
- 名称的第一个字符不能是数字。
- 区分大小写。
- 不能将C++关键字用作名称。
- 以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器以及其使用的资源)进行使用。以一个下划线开头的名称被保留给实现,用作全局标识符。
- C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。
3.1.2. 整型
char 1B
short 2B
int 4B
long 8B
long long 至少8B
根据操作系统位数不同,long和long long的长度都不一样。因为有的是最多只能存储32bit也就是4B。
还有,这些都是有符号数,具体不解释,从计算机组成原理当中能知道有无符号的区别,还有取值范围。
3.1.3. shot int long and long long
关于这些变量最大值的问题,可以引入一个climits头文件。
#include <iostream>
#include <climits>
using namespace std;
int main(){
int n_int = INT_MAX;
short n_short = SHRT_MAX;
long n_long = LONG_MAX;
long long n_llong = LLONG_MAX;
return 0;
}
1.运算符sizeof和头文件limits
sizeof运算符指出变量类型或变量名的大小
对变量类型使用的时候,需要放在括号中。对变量名使用的时候可以不用。
cout << "int is " << sizeof(int) << " bytes.\n";
cout << "short is " << sizeof n_short << " bytes.\n";
头文件climits定义了符号常量来表示类型的限制。
CHAR BIT char 的位数
CHAR MAX char 的最大值
CHAR_MIN char 的最小值
SCHAR_MAX signed char 的最大值
SCHAR_MIN signed char 的最小值
UCHAR_MAX unsigned char 的最大值
SHRT_MAX short 的最大值
SHRT_MIN short 的最小值
USHRT_MAX unsigned short 的最大值
INT_MAX int 的最大值
INT_MIN int 的最小值
UNIT_MAX unsigned int 的最大值
LONG_MAX long 的最大值
LONG_MIN long 的最小值
ULONG_MAX unsigned long 的最大值
LLONG_MAX long long 的最大值
LLONG_MIN long long 的最小值
ULLONG_MAX unsigned long long 的最大值
2.初始化
int n_int = INT_MAX;
int rowenci = 5;
short year;
year = 1998;
3.C++11初始化方式
int hamburgers = {24};
int emus{7};
int rheas = {12};
int rocs = {}; // setrocs to 0
3.1.4. 无符号类型
无符号数只能表示非负数
需要注意的就是unsigned本身是unsigned int的缩写。
3.1.5. 选择整型类型
注意所需存储的数据大小,考虑程序的可移植性。合理使用整型变量。
3.1.6. 整型字面值
整型字面值是显式地书写的常量,如212或1776。这是十进制的数。
C++有三种方法:
如果第一位为1~9,表示十进制数。
如果第一位为0,第二位为1~7,表示8进制数。(第二位如果不符合这个范围,就会报错。)
如果前两位为0x或者0X,表示16进制数。
在默认情况下,cout是以十进制格式显示整数,所以不管你的变量是用什么方式表示的,最后输出的都是经过换算后的十进制。
int hexadecimal = 42;
cout << hex;
cout << "hexadecimal = " << hexadecimal << endl;
如果想用特殊形式输出,直接在输出前加上hex或者oct
这知识修改cout显示整数的方式。
3.1.7. C++如何确定常量的类型
cout << "Year = " << 1492 << endl;
程序是否会将1492存储为int long或者其他整型?
除非有理由存储为其他类型(比如使用了特殊的后缀来表示特定的类型,如:浮点数,或者值太大,不能存储为int),否则就会存储为int类型
后缀:
整数后面的l或L表示long常量
u或U表示unsigned int
ul或UL或LU表示unsigned long
ll或LL表示long long
ull或Ull或uLL或ULL表示unsigned long long
3.1.8. char类型:字符和小整数
char存储的是字符,一个字符。当然也可以用char来存储数字。因为c语言使用ASCII来表示字符的。
cout.put()函数,该函数用来显示一个字符。
ASCII中
A = 65
a = 97
通用字符名:用来表示一些非英语的特殊字母。
char在默认情况下是否有符号是由C++实现来决定的。
所以也有signed char 和unsigned char。
wchar_t
在日文汉字系统中,字符可能不够用1B来表示。
wchar_t是一种整数类型,有足够的空间用来表示系统使用的最大扩展字符集。
cin和cout将输入和输出看做是char流,因此不适合用来处理wchar_t类型。
可以用wcin和wcout来处理wchar_t流。另外,可以通过加上前缀L来指示宽字符常量和宽字符串。
wchar_t bob = L'p'; // a wide-character constant
wcout << L"tall" << endl; // outputting a wide-character string
在支持wchar_t类型的系统中,上述代码把每个字符存储在2B的内存单元中。
因为Unicode,wchar_t显然不再满足需求,现在又新增了。
char16_t,16位无符号
char32_t,32位无符号
char16_t ch1 = u'q'; // basic character in 16-bit form
char32_t ch2 = U'\U0000222N' // universal character name in 32-bit form
bool类型,1 bit
true和false,分别是1和0
任何数字值赋值给bool时,都可以被隐式转换成bool值。
非零为true
零为false
3.2. const限定符
定义常量有两种方法
#define INT_MAX 32767
#define和#include一样,也是一个预处理器编译指令
这个指令是让预处理器在程序当中找INT_MAX,然后将所有的INT_MAX都替换为32767.
第二种方法就是使用关键字const。这是一种更好的处理符号常量的方法。
使用const关键字来修改变量声明和初始化。
const int Months = 12;
创建常量的通用格式:
const dataType name = value;
注意,应该在创建常量的时候就给常量赋值。
const的好处:能够明确指定常量的类型。而且可以和变量一样,限制常量的作用范围。最后,可以将const用于更复杂的类型,比如数组和结构体。
3.3. 浮点数
3.3.1. 浮点数的书写
12.34
939001.32
8.0
2.52e+8 // 2.52*(10^8)
8.33E-4 // 8.33*(10^(-4))
7E5 // 7*(10^5)
-18.32e13 // -18.32*(10^13)
9.11e-31 // 9.11*(10^(-31))
3.3.2. 浮点类型
float 4B
double 8B
long double 16B
3.3.3. 浮点常量
8.24和2.4E8这种都属于double类型
如果想让常量为float类型,就在后面加上f或者F
long double的话就用l或L
1.234f // float
2.45E20F // float
2.345324E28 // double
2.2L // long double
3.3.4. 浮点数的优缺点
范围大,运算慢,精度低
3.4. C++算数运算符
/
%
3.4.1. 运算符优先级
先乘除,后加减。
运算符重载:使用相同的符号进行多种操作
3.4.4. 类型转换
C++会自动执行很多类型转换
- 将一种算数类型的值赋给另一种算数类型的变量时
- 表达式中包含不同的类型
- 将参数传递给函数
注意,范围不同的值在转换类型的时候有可能会出问题,这个就去学计算机组成原理。
使用{}定义的变量在转换时有限制,条件是编译器知道目标变量能够正确的存储赋给它的值。
当同一个表达式中包含两种不同的算数类型的时候,C++将执行两种自动转换:首先,一些类型在出现时就会自动转换;其次,有些类型在与其他类型同时出现在表达式中时将被转换。
short chickens = 20;
short ducks = 35;
shot fowl = chickens + ducks;
这种情况下,bool、char、short等会被转换为int并进行计算。然后,程序将结果转换为short类型。这种情况叫做“整型提升”(integral promotion)。
不同类型之间进行算数运算的时候,也会进行转换,较小的类型会被转换为较大的类型。
- 如果有一个操作数的类型是long double, 则将另一个操作数转换为long double。
- 否则,如果有一个操作数的类型是double, 则将另一个操作数转换为double。
- 否则,如果有一个操作数的类型是float, 则将另一个操作数转换为float。
- 否则,说明操作数都是整型,因此执行整型提升。
- 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
- 如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高, 则将有符号操作数转换为无符号操作数所属的类型。
- 否则, 如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
- 否则, 将两个操作数都转换为有符号类型的无符号版本。
总结:
long double > double > float
如果都没有的话,就进行整型提升。
如果都是有符号或无符号,就转换为级别高的类型。
如果一个有符号,另一个无符号,无符号级别高,就把有符号转换为无符号操作数的类型。
否则就转换为有符号数的类型。
否则就转换为无符号的类型。
传参的时候,正常人都不会传不符合函数参数的变量吧。
C++还允许强转。
将变量thorn中的int值转换为long值
(long) thorn
long (thorn)
强转不会修改thorn变量本身,而是创建一个新的、指定类型的值,可以在表达式中使用这个值。
3.4.5. auto
auto是个好东西,编译器把变量的类型设置成与初始值相同
auto n = 100; // n is int
auto x = 1.5; // x is double
auto y = 1.3e12L // y is long double
3.5. 总结
记住各种类型就行。
3.6. 复习题
- 为什么C++有多种类型?
因为可以根据不同需求选取最适合的类型,方便处理以及存储。
- 声明与下属描述相符的变量。
a. short整数, 值为80
short a = 80;
b. unsigned int整数, 值为42110
unsigned int b = 42110;
c. 值为3000000000的整数
unsigned long c = 3000000000;
- C++提供了什么措施来防止超出整型的范围?
没有,可以使用climits来引入最大值,然后自行进行判断。
- 33L与33之间有什么区别?
一个是long,一个是int
- 下面两条C++语句是否等价?
char grade = 65;
char grade = ‘A’;
根据系统来说,有的等效有的不等效
- 如何使用C++来找出编码88表示的字符?指出至少两种方法。
char a = 88;
cout << a << endl;
cout.put(char(88));
cout << char(88) << endl;
cout << (char)88 << endl;
- 将long值赋给float 变量会导致舍入误差,将long值赋给double变量呢? 将longlong 值赋给double变量呢?
不会,会
-
下列C++表达式的结果分别是多少?
a. 8 * 9 + 2 74
b. 6 * 3 / 4 4
C. 3 / 4 * 6 0
d. 6.0 * 3 / 4 4.5
e. 15 % 4 3 -
假设x1和x2是两个double变量, 您要将它们作为整数相加, 再将结果赋给一个整型变量。请编写一条完成这项任务的C++语句。如果要将它们作为double值相加并转换为int呢?
int res = (int) x1 + (int) x2;
int res = (int) (x1 + x2);
- 下面每条语句声明的变量都是什么类型?
a. auto cars = 15 int
b. auto iou = 150.37f float
c. auto level = ‘B’ char
d. auto crat=U’ /000002155’ char32_t
e. auto fract = 8.25f/2.5 doube
3.7. 编程练习
-
编写一个小程序, 要求用户使用一个整数指出自己的身高(单位为英寸),然后将身高转换为英尺和英寸。该程序使用下划线字符来指示输入位置。另外,使用一个const符号常量来表示转换因子。
-
编写一个小程序, 要求以几英尺几英寸的方式输入其身高, 并以磅为单位输入其体重。(使用3个变量来存储这些信息。) 该程序报告其BMI(Body Mass Index, 体重指数)。为了计算BMI, 该程序以英寸的方式指出用户的身高(1 英尺为12 英寸), 并将以英寸为单位的身高转换为以米为单位的身高(1英寸=0.0254米)。然后, 将以磅为单位的体重转换为以千克为单位的体重(I千克=2.2磅)。最后, 计算相应的BMI—体重(千克)除以身高(米) 的平方。用符号常量表示各种转换因子。
-
编写一个程序, 要求用户以度、分、秒的方式输入一个纬度, 然后以度为单位显示该纬度。1度为60 分, 1分等千60秒,请以符号常量的方式表示这些值。对千每个输入值,应使用一个独立的变量存储它。
下面是该程序运行时的情况:
Enter a latitude in degrees, minutes, and seconds:
First, enter the degrees: 37
Next, enter the minutes of arc: 51
Finally, enter the seconds of arc: 19
37 degrees, 51 minutes, 19 seconds = 37.8553 degrees -
编写一个程序, 要求用户以整数方式输入秒数(使用long 或long long 变量存储), 然后以天、小时、分钟和秒的方式显示这段时间。使用符号常量来表示每天有多少小时、每小时有多少分钟以及每分钟有多少秒。该程序的输出应与下面类似:
Enter the number of seconds: 31600000
31600000 seconds = 365 days, 17 hours, 46 minutes, 40 seconds -
编写一个程序, 要求用户输入全球当前的人口和美国当前的人口(或其他国家的人口)。将这些信息存储在long long 变量中, 并让程序显示美国(或其他国家) 的人口占全球人口的百分比。该程序的输出
应与下面类似:
Enter the world’s population: 6898758899
Enter the population of the US: 310783781
The population of the US is 4.50492% of the world population. -
编写一个程序, 要求用户输入驱车里程(英里)和使用汽油量(加仑), 然后指出汽车耗油量为一加仑的里程。如果愿意, 也可以让程序要求用户以公里为单位输入距离, 并以升为单位输入汽油量, 然后
指出欧洲风格的结果即每100 公里的耗油量(升)。 -
编写一个程序, 要求用户按欧洲风格输入汽车的耗油量(每100 公里消耗的汽油量(升)), 然后将其转换为美国风格的耗油量—一每加仑多少英里。注意, 除了使用不同的单位计量外, 美国方法(距离/燃料)与欧洲方法(燃料/距离)相反。100 公里等于62.14 英里, l 加仑等千3.875 升。因此, 19mpg 大约合12.41/100km, 127mpg 大约合8.71/100km。
编程练习代码可以查看:https://blog.csdn.net/leowinbow/article/details/79745222
这里就不再放了