C++Primer(二)
C++是一种静态数据类型语言,它的类型检查发生在编译时。因此编译器必须知道程序中每一个·变量对应的数据类型。而python,smalltalk在运行时检查数据类型。
一、基本内置类型
空类型(void)和算数类型 算数类型又分为整型(包括字符布尔)和浮点型 C++语言规定int至少和short一样大 long至少和int一样大 long long以此类推。存储单位
1.计算机以bit序列存储数据。 2.可寻址的最小内存块叫字节。 3.存储的基本单元称为字(word)。 4.32位系统为4字 64位系统为8字。 通常float为1字,double为2字, 执行浮点运算时通常用double。类型转换
int和unsigned相遇 int转为unsigned 。当无符号超出所表示范围时,结果为初始值对无符号类型所能表示的数的个数取模。 当赋给带符号超出范围的值时,结果是未定义的。二、字面值常量
整形和浮点型字面值
十进制字面值的类型为int,long,long long中尺寸最小的那个(int)。 八进制和十六进制字面值的类型为能容纳其值的(int, unsigned int, long ,unsigned long, long long, unsigned long long)尺寸最小的那个。如果字面值连最大的数据类型都放不下就会产生错误,类型short没有对应的字面值字符串和转移序列
字符串字面值实际是const char* 类型 "A" 包含了A和空字符std::cout << "I love everything expect you,"
" but I want you!" << std::endl
这是字符串的分行书写
转义序列
\115 和 \x4d 都表示字符M,这里使用了泛化的转义序列。形式为\x跟1或多个16进制数字,或者\后跟一或多个8进制数字。如果8进制后面跟的数超过3个就只会转义前三个。另外如果是16位多位数,如果其范围超过char所能包含范围,也会报错。通常超过8位的16进制字符都以某个前缀开头的扩展字符集一起使用代码如下(示例):
L'a' //宽字符型字面值 wchar_t
u8"hi,tole" //仅用于字符串字面常量(UTF-8)
//前缀U、u分别代表Unicode16和32字符 char16_t char32_t
//后缀u或U都代表unsigned f-float l-long double(针对浮点型字面量,如果是整形字面量则代表long)
42ULL //无符号整形字面量 类型位unsigned long long
对于一个整形字面值,如果其后缀带有U,就会选择匹配的最小unsigned类型。如果后缀为L,则至少为long,如果为LL则在long long 或 unsigned long long中一种。混合使用也遵从上规则。
布尔字面值和指针字面值
布尔字面值为true和false nullptr为指针字面值三、 变量
列表初始化的形式int a{0}; //这就是列表初始化
long double ld = 3.1415926;
int c{ld}; //因为会丢失数据所以编译器拒绝了c初始化的请求
默认初始化
在函数体外的变量将被初始化为0,定义在函数体内部的变量将不被初始化。所以如果试图拷贝或者访问这个变量将会报错。 绝大多数类都支持无需显式初始化而定义对象,这样的类提供了一个合适的默认值。例如为为非显式初始化的string对象提供一个空字符串。也就是说其值由类决定。但是为了安全起见,建议初始化每一个内置类型的变量变量声明和定义的关系
c++支持分离式编译机制,也就是分为若干文件,每个文件独立编译。要这样做,我们需要有在文件之间共享代码的方法。 c++将声明和定义区分开,声明使得名字被程序所知,一个文件要使用别的文件定义的名字就必须包含对那个名字的声明。而定义负责创建与名字关联的实体。extern int i; //声明而非定义i
int j; //声明并定义
extern double pi = 3.1416 //抵消了extern的作用
//并且如果在函数内部这样做,会引发错误。
变量只能被定义一次,但可以被多次声明。要在多个文件中使用同一个变量,就必须将声明和定义分离。
总结
这就是关于基本类型的一些知识点,关于标识符作用域请自行查询相关资料。