P39, 左值和右值,书上说左值可以出现在等式的左边或右边,右值只能出现在等式的右边。我的理解是如果变量的存储位置是只读的,那就认为是右值,如果是可读可写的,那就认为是左值。一个常量只能是右值,普通变量是左值,函数返回值也只能是右值。
P42,初始化,书上说直接初始化就是把初始化式子放在括号中,复制初始化用等号,而且直接初始化的效率更高,这一点暂时无法理解。比如
int main()
{
int di(0xff);
return 0;
}
翻译成汇编是这样的:
08048544 <main>:
8048544: 55 push %ebp
8048545: 89 e5 mov %esp,%ebp
8048547: 83 ec 10 sub $0x10,%esp
804854a: c7 45 fc ff 00 00 00 movl $0xff,-0x4(%ebp)
8048551: b8 00 00 00 00 mov $0x0,%eax
8048556: c9 leave
8048557: c3 ret
这里是个立即数。
而
int ci = 0xff;
它的汇编代码也是一样的。
再看
int ci = 0xff;
int cci = ci;
它的汇编是这样的
08048544 <main>:
8048544: 55 push %ebp
8048545: 89 e5 mov %esp,%ebp
8048547: 83 ec 10 sub $0x10,%esp
804854a: c7 45 f8 ff 00 00 00 movl $0xff,-0x8(%ebp)
8048551: 8b 45 f8 mov -0x8(%ebp),%eax
8048554: 89 45 fc mov %eax,-0x4(%ebp)
8048557: b8 00 00 00 00 mov $0x0,%eax
804855c: c9 leave
804855d: c3 ret
而
int di(0xff);
int ddi(di);
汇编出来也是一样的。可能复杂一点的非内置类型的初始化不一样吧。
关于初始化和赋值的区别,初始化只一次,赋值可多次,而且会覆盖内存中原有的东西。
P49
1、非const的全局变量默认是extern的
2、const的全局变量,默认是static,如果需要外部文件访问,必须显示制定为extern。
非const的变量也可以显示的写成 extern int a_int = 20; 不过这样没多大意义,而且会得到一个警告。
3、extern声明的变量,与普通变量,只能定义一次
//a.cpp
extern int a_int = 20;
//b.cpp
extern int a_int = 20; //error, 在a.cpp中已经有过定义