c++ primer(第五版)笔记 第二章(2) 变量

#include<string>
#include<iostream>
using std::cout;
using std::endl;

int zero;			//定义
extern int i = 3;	//定义
extern int l;		//声明
extern int l;		//声明,可以多次声明,但定义只能有一个
extern int l;		//声明
int main()
{
	//数据类型决定了变量所占空间的大小,布局方式,空间所存储值的范围以及变量能参与的运算
	//初始化(initialized)是创建变量时赋予某一个初始值
	//赋值是把当前变量的值擦除,然后赋予另一个新值
	//初始化的几种方式:
	int a = 1, b = { 1 }, c(3.14), d{ 1 };	//花括号为 c++11 标准,初始化列表(initialized list),使用该方式初始化内置类型时,如果初始值存在丢失信息的风险,编译器会报错
	//int e{ 3.14 }; //conversion from 'double' to 'int' requires a narrowing conversion

	//内置类型的变量,定义在任何函数体外,将被初始化为0,而定义在函数内部的不会初始化,其值是未定义的
	//初始化每一个内置类型的变量是个好习惯
	cout << "zero:" << zero << endl;	//0
	int unkown;
	//cout << "unkown:" << unkown << endl; //Error uninitialized local variable 'unkown' used
	//类类型的对象如果没有显式初始化,其值由类决定
	std::string strNull;
	cout << "strNull:"<< strNull << "!" << endl;	//strNull:!

	//c++ 支持分离式编译(separate compilation)机制,静态类型(statically type)语言,在编译阶段检查类型,用于判断是否支持要执行的运算,所以在使用某个变量前必须声明其类型
	//变量的声明(declaration)规定了变量的类型和名字,使其为程序所知,除此之外,定义(definition)还申请了存储空间,有时还会初始化一个值,从而创建了与名字相关的实体
	//extern 关键字前缀表示声明,但如果同时显式初始化一个值则为定义,该行为在函数体内将引发错误
	//extern int k = 3; error C2205: 'k' : cannot initialize extern variables with block scope

	//标识符(identifier)由字母,数字,下划线组成,不能以数字开头,长度无限制,大小写敏感
	//保持一种命名规范,如 google C++ Style:https://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

	//域(scope),大多作用域都用花括号分隔,同一个标示符在不同的作用域可能表示不同的实体
	//名字的作用域从名字的声明处开始,到所在域末端结束
	//已声明的标识符可以在所有内层作用域被识别,并允许内层重新定义外层已有的标识符,还可以通过域操作符访问其他域的标识符
	int i = 5, sum = 0;
	cout << i << endl; //5,屏蔽了全局变量 i
	cout << ::i << endl; //3 访问全局变量 i

	for (int i = 0; i != 10; ++i)	//重新定义外层已有的 i,不指明域的情况下,循环体内的 i 都是该值
		sum += i;				//sum 使用的外层 sum
	cout << i << " " << sum << endl;	//5 45 无法访问内层域内的 i 值, 2个变量都是外层域的

	return 0;
}

发布了41 篇原创文章 · 获赞 1 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章