您的位置:首页 > 编程语言 > C语言/C++

[C++ primer]第2章 变量和基本类型

2015-09-29 01:23 253 查看
*谨做个人笔记,本系列不建议初学者以系统性学习为目的的使用

2.1基本内置类型

字符型不同于其他基本类型,被分成三种,char,signed char以及unsigned char

但是表现形式只有两种:带符号或者无符号的。类型char会变现为两种之一,具体哪种取决与编译器

所以在算术表达式中不建议使用char,因为不同编译器的结果不同

类型转换

浮点赋整型,只保留整数部分,不是四舍五入

赋给带符号类型超出他能表示的范围时,结果是未定义的

赋给无符号类型超出他能表示的范围时,结果是这个值对此无符号类型所能表示数值总数(如unsigned char表示0-255,总数为256)取模后的余数,此原理也适用于将一个负数赋给一个无符号数。

//如下所示,死循环

for (unsigned i = 10; i >= 0; --i)

...

字面值常量

形如42这样的数被称为字面值常量

十进制的字面值是有符号数,是int, long, long long中能容纳他的最小的那个

八进制或者十六进制的字面值,是int, unsigned int, long, unsigned long, long long, unsigned long long中能容纳他最小的那个,所以不一定带符号

-42的字面值,负号并不在字面值之内,负号是对字面值进行取负

默认浮点类型的字面值是一个double

也可以指定字面值的类型:

L'a'     //宽字符型字面值,wchar_t

u8“HI”   //UTF-8字符串字面值

3.1415L  //long double

细则见P37

2.2变量

当对象在创建时获得了一个特定的值,称之为初始化

=可以用于初始化,当然也可以用于后续赋值。初始化和赋值完全不同

初始化含义是创建变量时赋予一个初始值;赋值含义是把对象当前值擦除,用一个新值来替代。

C++ 11:列表初始化

用花括号来初始化变量。这种初始化方式更为严格,如果使用列表初始化时初始值存在信息丢失的风险,编译器将报错。
long double ld = 3.141592653
int a{ld}, b = {ld};    //报错
int c(ld), d = ld;      //正确,但丢失部分信息


变量声明与定义的关系

声明使得名字为程序所知,定义负责创建与名字关联的实体

如果想声明而非定义,在变量前加extern,而且不要初始化变量:

extern int i;  //声明而非定义

任何包含了初始化的声明即成为定义,如下extern被抵消了:

extern int pi = 3.14;

将声明与定义相分离使得多个文件中共享变量很方便

2.3复合类型

引用,即别名,引用必须初始化,因为无法将其重新绑定

引用不是对象,所以不存在引用的引用。引用只能绑定在对象上,不能绑定在字面值上。

引用的绑定对类型要求极为严格,必须左右匹配。但也有例外,允许常量引用绑定到一个非常量的对象,字面值,甚至一般表达式:

int i = 42;

const int &r1 = i;

const int &r2 = 42;

const int &r3 = r1 * 2;

int &r4 = r1 * 2;      //只有此句错误

指针,无需在定义时赋初值,但是建议初始化 int *p = nullptr, *q = 0, *r = NULL

同引用,指针也严格要求指向的类型匹配。

void *指针很特殊,可以存放任意对象的地址,但是作用很有限,比如拿他和别的指针比较,作为函数输入输出,或者赋给另外一个void *

个人理解:定义某种类型的指针,就相当于定义了对这个指针读取时用到的内存段,不同类型所占空间不同,所以不能将不同类型地址互赋;由于void *完全不知道是那种类型,所以更无法对他直接使用了。

引用本身不是对象,所以不能定义指向引用的指针,但是能定义指向指针的引用:

int i = 42;

int *p = &i;

int *&r = p;  //r的类型很难阅读,技巧是从右向左,离r最近的&标明r是一个引用,再往左边的*表示引用的是一个指针

2.4 const

const定义的变量虽不能修改,但是对const的引用可能是一个并非const的对象:

int i = 42;

int &r1 = i;

const int &r2 = i;

这样一来可以通过更改 i 或者 r1 来修改const的引用

编程风格:

当你第一次使用变量时再定义他

建议初始化所有指针,空指针使用nullptr代替NULL

C++ 11:

1、定义了数据类型long long, 至少和一个long一样大,对32位机器而言,一般是64位 即8字节

2、列表初始化
用花括号来初始化变量。这种初始化方式更为严格,如果使用列表初始化时初始值存在信息丢失的风险,编译器将报错。
long double ld = 3.141592653 int a{ld}, b = {ld}; //报错 int c(ld), d = ld; //正确,但丢失部分信息


3、nullptr

他是一种特殊类型的字面值,可以被转换为任意其他指针类型,如int *i = nullptr。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: