c语言的坑——for死循环
且看下面两个死循环,我曾经就踩过这个坑,是第二个坑,因此特意记录一下。char在keil和iar中都是无符号的,因此要特别注意。
unsigned char i;
for(i=0;i<256;i++)
{
//something
}
当我们用上述代码想实现一个小循环时,结果却事与愿违,这其实是死循环的另一种写法,因为无符号变量i最大只有255,要命的是,编译器并不会指出这个错误。
与之相类似的代码是:
unsigned char i;
for(i=10;i>=0;i--)
{
//something
}
这也是一个死循环,你看出什么原因了吗?无论i如何减,i都是大于等于0的。
这就告诉我们对于每个变量类型的取值范围要由清醒的认识。值得注意的是相同的变量类型对于不同的CPU构架和不同的编译器会有不同的结果。比如int类型在大多数16位CPU构架中占用两个字节,但在32位CPU中却往往占用4个字节;char类型在绝大多数编译器中都是有符号数,但在keil MDK中却是无符号数,若是要在keil MDK下定义有符号char类型变量,必须用signed显式声明。我曾读过一本书,其中有一句话:“signed关键字也是很宽宏大量,你也可以完全当它不存在,在缺省状态下,编译器默认数据位signed类型”,这句话便是有异议的,我们应该对自己所用的CPU构架以及编译器熟练掌握。
原文链接:https://blog.csdn.net/zhzht19861011/article/details/7251644