我看到一些C while循环,谓词为while(* ptr),而ptr通常是char *类型,这是如何工作的?这是否意味着“while()”还将接受除1或0以外的值作为谓词?
答案 0 :(得分:2)
在C中,任何非零值都被视为“真”,因此只要while (*ptr)
非零,*ptr
就会循环。
答案 1 :(得分:1)
让我们稍微扩展一下。
C中的while语法表示“如果条件为真,则执行正文;然后如果它仍然为真,则再次执行正文。”
正如卡萨布兰卡指出的那样,C中0的任何值都是“假的”;任何非零值都是“真”。 (值得考虑的是他们为什么选择它;如果你看一下PDP-11指令集,你可以得到一个很好的提示。)所以你可以扩展到
while /* the expression *ptr is nonzero*/)
/* do this */
表达式*prt
仅表示whatever is at the address stored in ptr
。
使用此模式的常用代码是字符串处理。说我们有
char myString[] = "Hello, world!" ; // remember char myString[] is equivalent
// to char * myString in C
char * ptr = myString; // note ptr points to myString[0]
while(*ptr){
putc(*ptr);
ptr ++;
}
现在只要ptr指向字符串中的字符,它就不为零,循环继续。但按照惯例,在C中,所有字符串都以NUL结尾,即字节宽度为0.所以 当循环到达最后一个NUL时,* ptr为0,循环结束。
你可以通过
更简洁地写出来 char * ptr = myString;
while(*ptr) putc(ptr++);
谜题:你能更简洁地写下这个吗?
答案 2 :(得分:0)
在C中,任何零都被认为是假的,其他任何东西都被认为是真的。该代码实际上是在说“当ptr不为空”时,给定空终止字符串是通过字符串遍历的常用方法。
答案 3 :(得分:0)
C期望while()
子句的条件是整数。如果整数为零,则while循环退出,否则执行它的body并再次计算条件。 C中的各种事物都以整数计算,包括字符。字符'\0'
(空字符)等于整数0
答案 4 :(得分:0)
在C中,任何非零值都被视为真。
答案 5 :(得分:0)
这是一个用于迭代C字符串的习惯用法,因为C字符串被定义为NUL终止。这是因为NUL字符\0
的值为零,您可能知道,值为零将导致while()
循环终止。
答案 6 :(得分:0)
因为在C中,最常见的字符串类型是以空字符结尾的字符串,所以有时候循环是有意义的
while(*ptr)
{
printf("%c", *ptr);
ptr++;
}
在字符数组中基本上从字符移动到字符,直到遇到空字符。当然这是不好的形式,因为'\0'
,null
和0
在给定系统上不一定相同,但在99%的环境中都有效。