2.1基本内置类型
基本数据类型包括算术类型和空类型
2.1.1 算术类型
算术类型分为整型(integral type,包括字符和布尔类型在内)和浮点型
内置类型的机器实现:
在计算机组成原理中学过有关机器字,还有机器字长的概念。
如何选择类型
2.1.2类型转换
2.1.3字面值常量
一个形如42的值被称作字面值常量(literal)。每个字面值常量都对应着一种数据类型,字面值常量的形式和值决定了它的数据类型。
整型和浮点型字面值
整型字面值具体的数据类型由他的值和符号决定。默认情况下,十进制字面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是无符号的。
(34条消息) C++ 字面值常量及其数据类型_W24的博客-CSDN博客_c++字面值类型
尽管整型字面值可以存储在带符号数据类型中,但严格来说,十进制字面值不会是负数。如果我们使用了一个形如-42的负十进制字面值,那个符号并不存在于字面值之内,它的作用仅仅是对字面值取负值。
默认的浮点型字面值是一个double,我们可以添加后缀来表示其他浮点型。
字符和字符串字面值
- 单引号‘’括起来的一个字符称为char型字面值,双引号""括起来的零个或多个字符构成字符串型字面值。
字符串字面值实际上是由常量字符构成的数组(array)。并且编译器在每个字符串的结尾处添加一个空字符(‘\0’),因此字符串的实际长度比他的内容多1。例如,字面值‘A’表示的就是单独的字符A,而字符串“A”表示的是一个字符数组,该数组包含两个字符:一个A,一个空字符。
如果两个字符串紧挨着且仅由空格,缩进,换行符分隔,则他们实际上是一个整体。当书写的字符串字面值比较长,写在一行不合适,可以分开书写。
std::cout<<"abdsadsadsadsa dsad asdsa asd safsa"
<<"dasdsad sa asdsa dsad sad";
转义序列
泛化的转义序列,其形式是\x后紧跟一个或多个十六进制数字,或者\后紧跟1个,2个或者三个八进制数字,数字部分表示的是字符对应的数值
指定字面值的类型
数值型加后缀,字符型加前缀
2.2.1变量定义
变量定义的基本形式是:首先是类型说明符,随后紧跟有一个或多个变量名组成的列表,其中变量名用逗号隔开,以分号结束,定义时还可以为一个或多个变量赋值:
int sum = 0,val,units_sold = 0;
Sales_item item;
//string是一种库类型,表示一个可变长的字符序列
std::string book("0-201-78325-x");
book的定义用到了库类型std::string,string也是在命名空间std中定义的。当下我们只需了解string类型是一种可变长字符序列的数据类型即可。C++库提供了几种初始化string对象的方法,其中一种是把字面值拷贝给string对象,上例book被初始化为0-201-78325-x
何为对象?
通常情况下对象是指一块能够存储数据并且具有某种类型的数据空间。
一些人仅在与类有关的场景下使用对象,另外一些人则已经把命名的对象和未命名的对象区分开来,他们把命名了的对象叫做变量。还有一些人把对象和值分开,其中对象指的是能被程序修改的数据,而值指的是只读的数据
本书遵循的是通常情况下的。
初始值
对象创建+初始值=初始化
在同一条定义语句中,可以用先定义的变量值去初始化后定义的变量
//正确:price先被定义并且赋值,随后被用于初始化discount
double price = 109,discount = price * 0.16;
//正确:调用函数applyDiscount,然后用函数返回值初始化salePrice
double salePrice = applyDiscount(price,discount);
初始化不是赋值,初始化的含义是创建变量的时候赋予其一个初始值,而赋值的含义是把对象的当前值擦除,用一个新值代替。
列表初始化
int test = 0;
int test = {0};
int test{0};
int test(0);
列表初始化指的是,用花括号来进行初始化。无论是初始化对象,还是某些时候为对象赋新值,都可以使用这样一组花括号括起来的初始值。
当用于内置类型的变量时,这种初始化形式有一个重要的特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:
#include <fstream>
using namespace std;
int main()
{
long double ld = 3.1415926;
int a{ ld }, b = { ld };
int c(ld), d = (ld);
}
使用long double的值初始化int变量时,可能会丢失数据,所以编译器拒绝了a和b的初始化请求。其中至少ld的小数部分会丢失掉,而且int也可能存不下ld的整数部分。
默认初始化
如果定义时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”。
如果内置类型的变量未被显式初始化,他的值由他定义的位置所决定。定义于任何函数体之外的变量被初始化为0。有一种情况例外,定义在函数体内部的内置类型变量将不被初始化。一个未被初始化的内置类型变量的值是未定义的,如果试图拷贝或以其他形式访问此类值将发生错误。
每个类各自决定其初始化对象的方式。而且,是否允许不经初始化就定义对象的也由类自己决定。如果它允许这种行为,它将决定对象的初始值到底是什么。
string类为没有指定初值的对象赋为空串
2.9:只看a和c
a是错误的,输入运算符的右侧需要一个明确的变量名称,而非定义变量的语句
int input_val;
std::cin>>input_val;
c是错误的
声明语句中多个变量需要用“,”分开。更改后
double salary,wage;
salary = wage = 9999.99;
2.10
global_str string类型本身接受无参数的初始化方式,初始化未赋值时,被赋予空串。
global_int 0
local_int 不被初始化
到这里我想到了之前的文章里给自己挖的坑
(35条消息) C++ primer 1.5 类简介_pplpkoopk的博客-CSDN博客
#include<iostream>
#include "Sales_item.h"
int main() {
Sales_item total,trans;
while (std::cin >> trans) {
total += trans;
}
std::cout << total;
}
我没有给total初始值。而是直接对他进行运算,是不是这里的问题导致最后的结果出错呢。大概是吧。