C++ Prime Plus学习笔记:第三章 处理数据

本文详细介绍了C++中变量命名规则、整型与浮点数类型的选择、常量与类型转换,以及算数运算符的使用技巧。特别关注了数据类型大小、范围、初始化、无符号类型和类型推断,以及const限定符在处理常量中的作用。
摘要由CSDN通过智能技术生成

第三章 处理数据

3.1. 简单变量

3.1.1. 变量名

命名规则:

  1. 在名称中只能使用字母字符、数字和下划线(_)。
  2. 名称的第一个字符不能是数字。
  3. 区分大小写。
  4. 不能将C++关键字用作名称。
  5. 以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器以及其使用的资源)进行使用。以一个下划线开头的名称被保留给实现,用作全局标识符。
  6. 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++会自动执行很多类型转换

  1. 将一种算数类型的值赋给另一种算数类型的变量时
  2. 表达式中包含不同的类型
  3. 将参数传递给函数

注意,范围不同的值在转换类型的时候有可能会出问题,这个就去学计算机组成原理。

使用{}定义的变量在转换时有限制,条件是编译器知道目标变量能够正确的存储赋给它的值。

当同一个表达式中包含两种不同的算数类型的时候,C++将执行两种自动转换:首先,一些类型在出现时就会自动转换;其次,有些类型在与其他类型同时出现在表达式中时将被转换。

short chickens = 20;

short ducks = 35;

shot fowl = chickens + ducks;

这种情况下,bool、char、short等会被转换为int并进行计算。然后,程序将结果转换为short类型。这种情况叫做“整型提升”(integral promotion)。

不同类型之间进行算数运算的时候,也会进行转换,较小的类型会被转换为较大的类型。

  1. 如果有一个操作数的类型是long double, 则将另一个操作数转换为long double。
  2. 否则,如果有一个操作数的类型是double, 则将另一个操作数转换为double。
  3. 否则,如果有一个操作数的类型是float, 则将另一个操作数转换为float。
  4. 否则,说明操作数都是整型,因此执行整型提升。
  5. 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
  6. 如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高, 则将有符号操作数转换为无符号操作数所属的类型。
  7. 否则, 如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
  8. 否则, 将两个操作数都转换为有符号类型的无符号版本。

总结:

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. 复习题

  1. 为什么C++有多种类型?

因为可以根据不同需求选取最适合的类型,方便处理以及存储。

  1. 声明与下属描述相符的变量。

a. short整数, 值为80

short a = 80;

b. unsigned int整数, 值为42110

unsigned int b = 42110;

c. 值为3000000000的整数

unsigned long c = 3000000000;

  1. C++提供了什么措施来防止超出整型的范围?

没有,可以使用climits来引入最大值,然后自行进行判断。

  1. 33L与33之间有什么区别?

一个是long,一个是int

  1. 下面两条C++语句是否等价?
    char grade = 65;
    char grade = ‘A’;

根据系统来说,有的等效有的不等效

  1. 如何使用C++来找出编码88表示的字符?指出至少两种方法。

char a = 88;

cout << a << endl;

cout.put(char(88));

cout << char(88) << endl;

cout << (char)88 << endl;

  1. 将long值赋给float 变量会导致舍入误差,将long值赋给double变量呢? 将longlong 值赋给double变量呢?

不会,会

  1. 下列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

  2. 假设x1和x2是两个double变量, 您要将它们作为整数相加, 再将结果赋给一个整型变量。请编写一条完成这项任务的C++语句。如果要将它们作为double值相加并转换为int呢?

int res = (int) x1 + (int) x2;

int res = (int) (x1 + x2);

  1. 下面每条语句声明的变量都是什么类型?
    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. 编程练习

  1. 编写一个小程序, 要求用户使用一个整数指出自己的身高(单位为英寸),然后将身高转换为英尺和英寸。该程序使用下划线字符来指示输入位置。另外,使用一个const符号常量来表示转换因子。

  2. 编写一个小程序, 要求以几英尺几英寸的方式输入其身高, 并以磅为单位输入其体重。(使用3个变量来存储这些信息。) 该程序报告其BMI(Body Mass Index, 体重指数)。为了计算BMI, 该程序以英寸的方式指出用户的身高(1 英尺为12 英寸), 并将以英寸为单位的身高转换为以米为单位的身高(1英寸=0.0254米)。然后, 将以磅为单位的体重转换为以千克为单位的体重(I千克=2.2磅)。最后, 计算相应的BMI—体重(千克)除以身高(米) 的平方。用符号常量表示各种转换因子。

  3. 编写一个程序, 要求用户以度、分、秒的方式输入一个纬度, 然后以度为单位显示该纬度。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

  4. 编写一个程序, 要求用户以整数方式输入秒数(使用long 或long long 变量存储), 然后以天、小时、分钟和秒的方式显示这段时间。使用符号常量来表示每天有多少小时、每小时有多少分钟以及每分钟有多少秒。该程序的输出应与下面类似:
    Enter the number of seconds: 31600000
    31600000 seconds = 365 days, 17 hours, 46 minutes, 40 seconds

  5. 编写一个程序, 要求用户输入全球当前的人口和美国当前的人口(或其他国家的人口)。将这些信息存储在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.

  6. 编写一个程序, 要求用户输入驱车里程(英里)和使用汽油量(加仑), 然后指出汽车耗油量为一加仑的里程。如果愿意, 也可以让程序要求用户以公里为单位输入距离, 并以升为单位输入汽油量, 然后
    指出欧洲风格的结果即每100 公里的耗油量(升)。

  7. 编写一个程序, 要求用户按欧洲风格输入汽车的耗油量(每100 公里消耗的汽油量(升)), 然后将其转换为美国风格的耗油量—一每加仑多少英里。注意, 除了使用不同的单位计量外, 美国方法(距离/燃料)与欧洲方法(燃料/距离)相反。100 公里等于62.14 英里, l 加仑等千3.875 升。因此, 19mpg 大约合12.41/100km, 127mpg 大约合8.71/100km。

编程练习代码可以查看:https://blog.csdn.net/leowinbow/article/details/79745222
这里就不再放了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值