第一章 C:穿越时空的迷雾
1、auto关键字显然是摆设,意思是“在进入程序块时自动进行内存分配”,与全局静态分配或在堆上动态分配相反。
2、register关键字。
3、“任何学习或使用c语言的人都应当使用ANSI C,而不是K&R C”。
4、
未确定的(unspecified)——在某些正确情况下的做法,标准并未明确规定应该怎么做。
如:计算参数的顺序。
未定义的(undefined)——在某些不正确情况下的做法,但标准并未规定应该怎么做。
如:有符号整数溢出该采取什么行动。
约束条件(a constraint)——这是一个必须遵守的限制或要求。
注:未确定的不会导致错误,但是未定义的可能会导致错误。标准规定编译器只有在违反语法规则和约束条件的情况下才能产生错误信息!
5 、两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
第二章 这不是Bug,而是语言特性
1、
switch (2) { case 1: cout << "case1\n"; case 2: cout << "case2\n"; case 3: cout << "case3\n"; case 4: cout << "case4\n"; } default: cout << "default\n";
case2
case3
case4
default
2、
第三章 分析C语言的声明
1、enum缺省整型值从0开始。
2、char * const * (*next)();
第四章 令人震惊的事实:数组和指针并不相同
1、数组名是个不可被修改的左值。
第八章 为什么程序员无法分清万圣节和圣诞节
1、万圣节 10月31日 圣诞节 12月25日
八进制31等于十进制25。
第九章 再论数组
1、对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。
2、所有作为函数参数的数组名总是可以通过编译器转换为指针。
第十章 再论指针
1、
int squash [23][12]; // int 类型的二维数组
int *squash [23]; //23个int类型指针的向量
int **squash; //int类型的指针的指针
int (*squash)[12]; //类型为int数组(长度为12)的指针
分析:
int *squash [23]; 指针数组, squash先和[]结合(因为[]比*优先级高),说明squash是一个具有23个元素的数组,
然后与*结合,说明数组里的元素是指针类型,然后与int结合,说明指针所指向的内容是整型的。
int (*squash)[12];数组指针, squash先和*结合,说明squash是一个指针,然后与[]结合,说明指针指向的内容是一个数组,再与int结合,说明数组里的元素是整型的。
2、二维数组作为函数参数传递。
int myarray[2][3];
void fun(int array[2][3]);
void fun(int array[][3]);
void fun(int (*array)[3]);
不能void fun(int **array);也不能void fun(int array[][]);
第十一章 你懂得C,所以C++不在话下
1、友元函数不是类的成员函数,它不带有this指针,因此必须将对象名或对象的引用作为友元函数的参数,并在函数体重使用运算符 . 来访问对象的成员。
友元函数可以访问类中所有成员。