《C和指针》读书笔记(二)

第五章 操作符和表达式

 

1.在左移位中,值最左边的几位被丢弃,右边多出来的几个空位用0补齐。

  右移位操作存在一个左移位操作不曾面临的问题:从左边移入新位时,可以选择两种方案。一种是逻辑移位,左边移入的用0填充;另一种是算术移位,左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0,这样就能保持正负形式不变。

2..A&&B,如果A为假,则不执行B。A||B,如果A为真,则B不执行。又被称为断路求值。

3.左值是能出现在赋值符号左边的东西,右值就是那些可以出现在赋值符号右边的东西。

4.复杂表达式的求值顺序是由3个因素决定的:操作符的优先级,操作符的结合性以及操作符是否控制执行的顺序。

 

第六章 指针

 

1.内存中每个位置有一个独一无二的地址标识。内存中每个位置都包含一个值。

2.一个变量,名字和内存之间的关联并不是硬件所提供的,而是编译器为我们实现的。

3.值得类型并非值本身所固有的一种特性,而是取决于它的使用方式。一个变量的值就是分配给这个变量的内存位置所存储的数值。

4.使用之前确定指针已被初始化。

5.用一个单一的值表示两种不同的意思是非常危险的。

6.指针可以作为左值,并不是因为它们是指针,而是因为它们是变量。

7.*操作符具有从右向左的结合性。

8.当某个值的存储位置并未清晰定义时,则该表达式不能做左值。

9. 当一个指针和一个整数量执行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。这个“合适的大小“就是指针所指向类型的大小。“调整”就是把整数值和“合适的大小”相乘。

第七章 函数

1.在C中,子程序无论是否存在返回值,均被称为函数。调用一个真函数(即返回一个值的函数)但不在任何表达式中使用这个返回值是完全可能的。在这种情况下,返回值就被丢弃。但是,从表达式内部调用一个过程类型的函数(无返回值)是一个严重的错误,因为这样一来在表达式的求值过程中会使用一个不可预测的值(垃圾)。

2.当程序调用一个无法见到原型的函数时,编译器便认为该函数返回一个整型值。

3.所有的参数都是传值调用。但是,如果被传递的参数是一个数组名,并且在函数中使用下标引用该数组的参数,那么在函数中对数组元素进行修改实际上修改的是调用程序中的数组元素。函数将访问调用程序的数组元素,数组并不会复制。这个行为被称为“传址调用”。

4.迭代的效率往往比递归高。

5.函数的传参顺序是从右向左的。

第八章 数组

1.除了优先级外,下标引用和间接访问完全相同。

2.为什么编译器不进行下标检查,因为C的下标检查所涉及的开销比你刚开始想象的要多。

3.下标绝不会比指针更与效率,但是指针有时会比下标更有效率。但是以牺牲程序的可维护性为代价获得程序的运行时效率的提高可不是个好主意。

4.数组特性:连续性,有序性,一致性。

5.如果你打算在指针上执行任何指针运算,应该避免这种类型的声明。(无长度的数组指针)。


你可能感兴趣的:(《C和指针》读书笔记(二))