《C陷阱与缺陷》学习笔记

单引号本质代表引用一个数字,而双引号本质上代表一个指针。

printf(‘\n’)在当今大多数编译器非法。

a+++++b的解法:

这种写法应当有一个最合理的解释:

a++ + ++b

但是编译器执行的是大嘴编译法,对于编译器至少看上去应当为:(((a++) ++) +b),但是一个常量不允许++操作,

所以这个语句反而成为了非法语句。

以下是一个测试是否可以嵌套注释的语句,如果可以嵌套则返回1,不然就返回0,可以试试。

/*/*/0*/**/1 1 0

各个类型指针大小在64位系统大小均为8字节

#include<stdio.h>#include<string.h>int main(){int *a;char *b;short *c;long *d;printf("int=%d char=%d short=%d long=%d\n",sizeof(a),sizeof(b),sizeof(c),sizeof(d));return 0;}

在双目运算符中算术运算符优先级最高,移位运算符次之,关系运算符再次之,接着是逻辑运算符,赋值运算符,最后是条件运算符。

Switch语句的case,与dafult的位值问题,及break 的遗漏问题

f ; 这个语句其实计算了函数的地址

else注意与if 的匹配问题

数组允许在最后多余的逗号

sizeof运算符可以计算数组的长度除以类型就是数组元素的个数。

#include<stdio.h>int main(){int a[]={1,2,3,4,5,6};int b=(sizeof(a)/sizeof(int));printf("%d\n",b);return 0;}

对于数组我们只能做两件事:确定数组的长度,,获得指向下标为0的元素

任何一个数组下标运算都等同于与一个对应的指针运算。

任何指针都是指向某种类型的变量

指针相加是无意义的,如果在同一个数组只有减法是有意义的

数组名是一种指向数组的指针,它是有类型的不可以与其他类型指针赋值

非数组的指针,字符串其实代表了本身字符加一个结束字符,在内存中是一个地址,当使用str系列函数是请确保已有的字符串是已经分配内存的。

malloc()函数使用时注意:1.判定成功分配,2.及时释放已经分配的空间

声明的一个指针和一个数组是两个完全不同的东西

空指针并非空字符串

Static关键字的使用:

1.在修饰变量时,将变量的作用域限制在源文件或者局部子函数中。

2.在修饰函数时,限定作用域减少名字冲突

注意函数的返回值,最好在声明与定义时写好函数的返回类型,参数类型减少不必要的麻烦

检查外部类型,

eg:

extern int n;

long n;

这是一个无效的程序,同一个没有被限制的变量被声明成两个不同的类型

一般请显示的定义main()函数的返回值

#define max(a,b) ((a)>(b)?(a):(b))

尤其在函数调用时注意各参数的类型提升

注意内存位置为0

一般计算机不允许读取内存地址0;

#include<stdio.h>int main(){char *p;p = NULL;printf("Location 0 countion %d\n",*p);return 0;}这个程序因为不能访问地址0,所以会产生段错误。

注意不对称边界问题单引

人生伟业的建立 ,不在能知,乃在能行。

《C陷阱与缺陷》学习笔记

相关文章:

你感兴趣的文章:

标签云: