[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:列表初始化
用花括号来初始化变量。这种初始化方式更为严格,如果使用列表初始化时初始值存在信息丢失的风险,编译器将报错。
变量声明与定义的关系
声明使得名字为程序所知,定义负责创建与名字关联的实体
如果想声明而非定义,在变量前加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、列表初始化
用花括号来初始化变量。这种初始化方式更为严格,如果使用列表初始化时初始值存在信息丢失的风险,编译器将报错。
3、nullptr
他是一种特殊类型的字面值,可以被转换为任意其他指针类型,如int *i = nullptr。
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。
相关文章推荐
- C语言中不允许创建临时变量,交换两个数的内容
- effective c++绝不在构造和析构过程中调用virtual函数
- C++类中的main函数
- 转换大小写字母
- 求两个数的最大公约数。
- 将三个数按从大到小输出。
- C语言冒泡排序法分析及代码实现
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- C语言中可变长参数使用
- trace工具,c++/c#/python
- 将数组A中的内容和数组B中的内容进行交换。(数组一样大)
- 【算法C++】烙饼排序
- c语言的按位运算符
- C语言冒泡排序法分析及代码实现
- 统计英文单词词频(c版)
- c++ operator
- 【C语言】接收字符,大小写字符相互转换后输出,数字不输出
- 【C语言】求两个数的最大公约数
- 【C语言】三个数从大到小输出
- 黑马程序员——C语言日志——指针、地址和变量值