1.無窮loop
int i,a[10];
for(i=0;i<=10;++i)
{
a[i] = 0 ;
}
for(i=0;i<=10;++i)
{
a[i] = 0 ;
}
why?
函數運行時堆棧:
a[0] a[1] ....a[9] i
a[10] = 0;改變i的值為0,造成無窮循環
2.八進制的誤用
int i[] = { 012,
024,
125,
};
024,
125,
};
為了對齊可能造成的錯誤,變成了八進制
3.如何調用地址為0的過程?
(*(void(*)())0)();
ps:在大多數現代操作系統,進程引用的地址為虛擬地址,所以這個調用可能合法
4.運算符的優先級
int i = 1;
i = i<<4 + 2;
i = i<<4 + 2;
這時i的值是多少?
不是18,是64,因為 i=i<<4+2; <==> i=i<<(4+2);
5.懸掛的if
if(x==0) //1
if(y==0) error(); //2
else{ //3
z=x+y;
f(&z);
}
if(y==0) error(); //2
else{ //3
z=x+y;
f(&z);
}
C中的else總是和最近的if匹配,所以3和2匹配,而不是和1匹配。等價于
if(x==0) //1
{
if(y==0) error(); //2
else{ //3
z=x+y;
f(&z);
}
}
{
if(y==0) error(); //2
else{ //3
z=x+y;
f(&z);
}
}
解決方法:總是使用{}和if配對