关于C的while循环不成立条件的发现?求解!!
最近写C语言程序发现了几点问题,求高手指点!!
在很多关于C语言循环条件的书籍上都是这么说的:当值为真(非0)时, 执行循环体语句。当值为假(0)时退出循环。包括谭浩强的《C程序设计》和《C++ Primer》。但是最近重新研读C时,却发现了一些问题,具体见下面代码(当然,有一些时死循环):
- C/C++ code
#include"stdio.h"int main(){ while(0) { printf("while(0)的循环执行了。\n"); //很明显,这段不会执行! } //下面问题来了! 数值0的ASCII码是48(十进制),而使用ASCII码时却出现了问题,见下面: int a='\x30';//数值0的ASCII码十六进制是:'\x30' while(a) { printf("while(a)的循环执行了。\n"); //此段代码得到了执行!!!!! } //下面的问题更加离奇,使用‘\0’作为循环条件时不会执行循环程序 while('\0') { printf("while('\0')的循环执行了。"); //这个循环也没有得到执行 } printf("执行了循环外的程序!\n"); return 0;}我在VC6.0和C_Free这两个编译器上都得到了同样的结果。
既然这样,上面的那条结论就不正确了,还网友帮我解答一下吧,万分感谢!!!
[解决办法]
LZ既然看过了书了,那我拿书上的原话跟你讲。。< C primer plus > 121页,讲到while循环,里面的原话是 “请注意关系表达式也可以用于字符的比较。进行比较时使用的是机器的字符代码(我们假定为ASCII)
" 也就是说,'0'比较是时候其实是48,而不是用字符做比较
[解决办法]
大哥,所谓0和非0都是针对数值来说的……
对于C语言,先把一切的种种,char也好,指针也好,结构体也好,任何类型先变成数值,然后再判断所谓0和非0……
[解决办法]
你好,你的回复对我帮助很大!
我想请教一下,我在while(__)条件里面写上数值:0 或 字符'\0' 都能使循环退出,但两者的ASCII码并不相同(数值0的ASCII码是48,'\0'的ASCII码是0),说明编译器不是通过ASCII码判定循环条件的,我上面的while(a)即while('\x30') 也验证了这一点。老谭的那句“当值为真(非0)时, 执行循环体语句,当为假(0)是退出循环”是不是说的过于笼统啊?C是怎么实现循环退出的啊?(抱歉,我用C++和Java太久了,C完全抛弃了)
----------------------------------------------
楼主你把字符0与数字0搞混淆了, char a = '0';
printf("%c", a); 输出是0
printf("%d", a); 输出是48;
int a = 0;
printf("%d", a); 输出是0
char a = '\0'
printf("%d", a); 输出是0
printf("%c", a); 输出是空
请分清楚字符类型与整数类型
[解决办法]
哈,有时候多说多错,少说少错,还是不说为妙
[解决办法]
你要理解本质的东西,而不是表象。你亲自查看一下内存中到底存储的什么东西就明白了,'\0'在内存中实际上是0,如果是32位框架的话,内存中就是0x00,而数值0在内存中也是0x00,而ASCII码得'0'在内存中存储的却是0x30,
代码的执行最终肯定是看内存中到底存的是什么,而不是加不加引号之类的表象东西,如果判断语句中的变量内存中为0x00 条件就为假,退出while循环,否则就继续执行。