1,左值与右值
a,定义在函数体外,全部初始化为0;
b,定义在函数体内,
使用默认构造函数
表达式为定义;
if(有初始化式) && (有extern)
{
该定义只能位于函数外部;
}
表达式为声明;
左值:既能出现在赋值语句的左边,又能出现在赋值语句的右边的表达式;
右值:只能出现在赋值语句的右边而不能出现在赋值语句的左边的表达式。
变量是左值,数字字面值、数字表达式是右值。
通常左值比右值适用范围更广,但是有一个例外:const 引用可以指向右值,但不能指向左值。
2,标识符(变量名即变量的标识符,函数名是函数的标识符)
(1)必须以字母或下划线开头,区分大小写;
(2)不得占用C++的63个关键字和11个操作符替代名;
(3)C++03和C++11的标准都规定,标识符不能包含两个连续的下划线,也不能以一个下划线和一个大写字母开头。定义在函数外的标识符(如全局变量)不能以下划线开头。标准原文如下:
— Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use.
— Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.Such names are also reserved in namespace ::std.
但是,在实际应用中编译器,不管是g++还是visual studio并不一定会为此报错。
个人理解:这样的标识符是“ is reserved to”(保留给)编译器用的,但可能编译器不会去检查标识符是否违反了这条规则。如果编译器刚好没用这个标识符,那么就不会因有冲突而报错。
3,自动初始化
(1)内置类型:
(i)自动变量,不自动初始化,值未知;
(ii)static变量,第一次调用时初始化为0,以后不初始化;
(2)类类型
4,初始化的两种方式
(1) =,被称为复制初始化;
(2) (),被称为直接初始化
5,声明与定义
(1)有初始化式的必定是定义,不管有没有使用extern;
(2)如果有初始化式,又使用了extern,则该定义只能位于函数外部;
(3)不包含初始化式,且含有extern,则为声明,不是定义;
(4)如果不包含extern,不管有没有初始化式,都是定义;
(5)同一个变量,只能定义一次,但可以声明多次;
if(有初始化式) || (没有extern)
{
//注意,C++中非const变量默认就是带extern属性的,所以加不加extern关系不大
//但是,const变量默认不是extern属性的,所以定义用于其他文件的const变量时,就需要加extern
}
else
{
}
6,作用域
全局作用域(global scope)
局部作用域(local scope)
语句作用域(statement scope)