《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,所以会产生段错误。

注意不对称边界问题单引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值