我想知道在谓词中c发生了什么?

时间:2011-02-06 03:41:07

标签: c

我看到一些C while循环,谓词为while(* ptr),而ptr通常是char *类型,这是如何工作的?这是否意味着“while()”还将接受除1或0以外的值作为谓词?

7 个答案:

答案 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'null0在给定系统上不一定相同,但在99%的环境中都有效。