1.对于unsigned类型来说,负数总是超过其取值范围。Unsigned类型的对象可能永远不会保存负数。有些语言中将负数赋给unsigned类型是非法的,但在C++中这是合法的。
注:C++中,把负值赋给unsigned对象的完全合法的,其结果是该负数对该类型的取值个数求模后的值。所以如果把-1赋给8位的unsigned char,那么结果是255,因为255是-1对256求模后的值。
习题:
当给16位的unsigned short对象赋值100000时,赋的值是什么?
解答:
34464.
100000超过了16位的unsigned short类型的表示范围,编译器以其二进制表示截取低16位,相当于对65536求余(求模,%),得34464。
2.变量名,即变量的标识符,可以由字母,数字和下划线组成。变量名必须以字母或者下划线开头,并且区分大小写:C++中的标识符都是大小写敏感的。除了关键字,C++还保留了一组标识符用于标准库。标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。有些标识符(在函数外定义的标识符)不能以下划线开头。
习题:
下面哪些名字是非法的?
(a)int double = 3.1415;
(b)char _;
(c)bool catch-22;
(d)char 1_or_2 = ‘1’;
(e)float Float = 3.14f;
解答:(a)(c)(d)
3.初始化,C++支持两种初始化方式:复制初始化和直接初始化。即如下两种形式:
int ival(1024);
int ival = 1024;
3.1在C++中理解“初始化不是赋值”是必要的。初始化指创建对象变量并给它赋初始值,而赋值则是擦除对象当前值关用新值代替。
3.2当初始化类类型对象时,复制初始化和直接初始化之间的差别很微妙的。现在我们只知道,直接初始化语法更灵活效率更高。
3.3在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行初始化。未初始化变量引起的错误难以发现,我们要牢记:永远不要依赖未定义行为!
习题:
下列变量的初始值是什么?
Std::string global_str;
Int global_int;
Int main()
{
Int local_int;
Std::string local_str;
Return 0;
}
Global_str和local_str的初始值均为空字符串,global_int的初始值为0,local_int没有初始值。
4.如果声明有初始化式,那么它可被当作是定义,即使声明为extern:
Extern double pi = 3.1415;
虽然使用了extern,但是这条语句还是定义了pi,分配并初始化了存储空间。只有当extern声明位于函数外部时,才可以包含有初始化式。
5.非const变量默认为extern。要使const变量能够在其他的文件中访问,必须显式地指定它为extern。
习题:下列语句合法吗?
Const int buf;
解答:不合法,因为定义const变量时必须进行初始化。
6.设计头文件时,记住定义和声明的区别是很重要的。定义只可以出现一次,而声明却则可以出现多次。下列语句是一些定义,所以不应该出现在头文件里:
Extern int ival = 10;
Double fica_rate;
虽然ival声明为extern,但是它有初始化式,代表这条语句是一个定义。类似地,fica_rate的声明虽然没有初始化式,但也是一个定义,因为没有关键字extern。同一个程序中有两个以上文件含有上述任一个定义都会导致多重定义错误。
故:因为头文件包含在多个源文件中,所以不应该含有变量或者函数的定义。
习题:
下列声明和定义哪些应该放在头文件中?哪些应该放在源文件中?
(a) int var;
(b) const double pi = 3.1415;
(c) extern int total = 255;
(d) const double sq2 = sqrt(2.0)
解答:
(a)(c)(d)
本文讲解了C++中unsigned类型处理、变量命名规则、初始化方式及其区别、变量定义与声明等核心概念。并通过实例帮助理解如何正确使用这些特性。

被折叠的 条评论
为什么被折叠?



