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

猜你喜欢

转载自www.cnblogs.com/CodeWorkerLiMing/p/12146085.html