C++ Primer读书笔记第二章②
C++ Primer
第二章 变量和基本类型
变量
变量提供一个具名的,可供程序操作的存储空间。 C++中的每个变量都有其数据类型。 数据类型决定着变量
- 所占内存空间的大小
- 存储值得范围
- 能参与的运算
变量定义
对于初始化,C++的规定比较特殊,说明如下。int a = 0; //首先是类型说明符(int),随后是变量名,最后是初始化(赋予一个初值) //也可以连续定义变量,注意变量之间是逗号 int a = 0, b = 1;
int c = 1;//用等于号初始化
c = 2;//先把原来的1擦除,赋值2
++初始化不是赋值,初始化是创建变量时赋予它一个初始值;赋值是把变量当前的值擦除,以一个新的值代替。++ 可能你现在觉得没什么区别,以后就会知道了。
除了上面使用的等于号初始化,还有两种初始化要了解。
- 列表初始化
int d{0}; //等价于int d = 0, 也等价于int d(0)
使用花括号{}来初始化有一个很6的地方(当它跟类型转换混一起的时候),它不允许你丢失信息,听不懂的话下面举例说明:
double pi = 3.14;
int p1{pi}, p2 = {pi};//错误:列表初始化不允许损失信息
int p3(pi), p4 = pi;//正确:转换执行,且确实丢失了部分信息
- 默认初始化
程序员没有对a明确的初始化,则编译器默认初始化其为0,不同类型的变量默认初始化的值也不一样,那我们要不要去记住哪些变量类型对应的默认初始化值是多少呢?不用记,最好的办法就是我们不要默认初始化,每次定义一个变量,就赋给它一个初值。int a;
变量声明和定义的关系
为了支持分离式编译(暂时可以理解为程序可以拆分为多个文件,然后一起编译),C++语言将声明合定义区分开:
- 声明:使得名字为程序所知
- 定义:负责创建与名字关联的实体
extern int i; //声明i,声明一个变量就在它前面加上关键字extern,且不要初始化
int j; //声明并定义j
extern int k = 0;
//定义k,因为赋予了初值,所以等价于int k = 0;
//但是你在函数体内部不能这么干,包括main函数,会报错
//所以,还是老老实实用前面两种方式吧
如果要在多个文件中使用同一个变量,就必须将声明和定义分离。变量的定义只能出现在一个文件中,其他用到该变量的文件必须对其声明,不能重复定义。 可以这么理解:定义是创建实体,实体只有一个,我们定义了一个变量,就创造了一个工具,比如说一个榔头,然后我们在其他文件中想要用榔头,那就喊榔头一声,就声明一下。 所以啊,变量只能被定义一次,但可以被多次声明;对应着工具只需要创造一次,但可以被多次使用。
C++是一种静态类型语言,在编译阶段检查类型。
变量命名规范很重要
- 标识符(例如变量名)要能体现实际含义
- 变量名一般用小写字母,如index,不要使用Index或INDEX
- 用户自定义的类名一般以大写字母开头,如Bookstore
- 如果标识符由多个单词组成,单词间应该有区分,如student_boy或studetBoy,不要使用studentboy。 以上的规范都是为了代码的可读性。 作者原话:对于命名规范来说,若能坚持,必将有效。
名字的作用域
用大括号来区分,这个我个人觉得特好理解,直接贴一段截取字符串实现sunstring的代码来看这个特点。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str; //str是main函数的全局变量,在main函数里都可以用,如while中
int num;
while (cin >> str)
{
cin >> num;
string sub;//sub是while这个花括号中的变量,在括号外面不能用
int len = str.length();
if (num <= len)
{
if (str[num - 1] > 128)
{
--num;
}
sub = str.substr(0, num);
}
cout << sub << endl;
}
return 0;
}
还有一种情况要注意,可以重复定义,比如在上面的代码中,我在while循环中定义一个string str是正确的,而且会覆盖main函数中的str,可以理解为我要搞个特殊的str用用。不理解的话我写段代码举个例子
#include <iostream>
int main()
{
int a = 0;
{
int a = 1;
cout << a;
}
cout << a << endl;
return 0;
}
这段代码打印输出的分别是10,因为里面的a覆盖了外面的a。
#C++工程师#