#include int main(void){ int a = -10; unsigned b = 1; if(a b > 0) printf("a b > 0\n"); else if (a b < 0) printf("a b < 0\n"); else printf("a b = 0\n"); return 0;} 运行结果:
a b > 0 浅析:第一眼看到这道题心里想到这不明摆着 -10 1 < 0么,如此easy的题目还要算吗?当程序运行出结果时顿时傻眼了,仔细看了看数据类型发现问题出在了类型的转换上。众所周知,在不同类型的数据进行运算时如果不进行特别的转换那么在数据运算时会先将表示范围较小的数据自动转换成表示范围更广的数,再参与运算,所以本题中会先将int型的a转换成unsigned int型,通过补码运算得知该值为:4294967286,该值加上1会肯定会远大于0,因此输出的是a b>0。
3溢出问题程序一:
unsigned i; for (i = 110; i >= 0; i--) printf("%u\n",i); 运行结果:死循环 浅析:该题的坑就在于没有注意到unsigned int 的存储范围,当小于零溢出时又会从unsigned int 的最大值开始递减,这就仿佛进入了一个圆环,永远都没有办法找到跳出圆环形跑道的缺口。 程序二:
#include #include int main(void){ char a[1000]; int i; for(i = 0; i < 1000; i ) a[i] = -1 - i; printf("%d\n",strlen(a)); return 0;} 运行结果:255 浅析:这道题看上去很简单但是却暗藏杀机,很少有人能够答对,当i从0开始自增,自增到127时-1 - 127 = -128,而这个数正好是char型变量所能表示的最小数字,i再自增一次就会溢出,变成char所能表示的最大数字,这样又进入了上一题的那个“环”,当i增加到255时-1 - i = 0,此时第一次出现了0,而strlen函数碰到'\0'就结束(不包括),因此输出结果为255。关注公众号 逆锋起笔,回复 pdf,下载你需要的各种学习资料。
4strcpy函数
void test(){ char str[10],str1[10]; int i; for(i = 0; i < 10; i ) { str1[i] = 'a' i; } strcpy(str,str1);} 浅析:这段代码第一眼看过去是没问题的,但是再看一眼就能够很轻松找到错误了,strcpy函数是拷贝字符串的函数,它是以'\0'为结尾的,因此当程序运行strcpy这一行时会发生内存非法访问导致程序崩溃。