<C陷阱与缺陷>理解
- if(x=y) 此语句为将y的值赋值给x,然后判断值是0或是非0,也就是最终x的值决定是真是假
- 如果一个整型变量第一个字符是数字0,他就会被当作八进制数
- 下列hello和hello1等效
char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', 0};
char hello1[] = {"hello\n"};
printf(hello);
printf(hello1);
- 以下代码的意图是:如果x等于0运行下面if,如果0不等于x则输出error,但是结果却大相径庭,因为if总与它最近的那个else匹配(除非有花括号),所以此结果相当于0等于x后判断0是否等于y,如等于输出Y否则输出错误,如果要避免此类错误,在if || else后用花括号是个良好的习惯
if(0 == x)
if(0 == y)printf("Y\n");
else
{
printf("ERROR\n");
}
- 使用指针时,应当避免指针和指针所保存地址里的内容混淆,如,
char *p, *q;
p = "abc";
q = p;
注意,q和p都保存了"abc\0"的地址,而不是把p指向的内容赋值到q;
- 这段代码中,本意是把a数组清零,单却有"意外效果",本来i<10,写成i<=10,也就是说,在数组a后的一个字的内存被清0,如果这段程序的编译器是按照内存地址递减的方法来给变量分配内存,那么内存中被清零的变量则是i,所以这段程序陷入死循环,持续打印0~9.
int i=0,a[10];
for(i=1; i<=10; i++)
{
a[i] = 0;
printf("%d\n",i);
}
- 如果int a ;在函数体外定义,那么说明了此变量是一个外部整型变量,同时为a分配了存储空间,没有赋值,所以初始值为0
- 如果有以下宏定义
#define max(a,b) ((a)>(b)?(a):(b));
在使用时,定义一个x数组,循环判断找最大,
int x[] = {2,3,1,4};
while(i<n)
{
num = max[big,x[i++]]
}
//展开
//num = ((big)>(x[i++])?(big):(x[i++]));
展开max,宏定义则会出现此类问题,重复了,解决此类问题有两种方案,1.使用函数。2.在使用时避免此类使用(如下)
for(i=0; i<n; i++)
{
num = max[big,x[i]]
}