2011-02-06 81 views
2

我看到一些C while循环与谓词while(* ptr),而ptr通常是char *类型,这是如何工作的?这是否意味着“while()”也将接受除1或0以外的值作为谓词?我想知道在谓词中发生了什么?

+0

while(* ptr)其中ptr是一个字符串将失败时,该字符串恰好不是空终止。 – dicroce 2011-02-06 03:48:42

回答

2

在C中,任何非零值都被视为“真”,因此while (*ptr)将循环,只要*ptr为非零。

0

在C中,任何零都被认为是错误的,其他的东西都被认为是真的。该代码实质上是说“虽然ptr不为空”,给出以null结尾的字符串是走过字符串的常用方法。

+0

确切地说错了。 0不正确。任何0都是错误的,其他的都是真的。 – dicroce 2011-02-06 03:47:32

+0

确实,尴尬。我正在考虑过程编辑代码和成功。 :( – 2011-02-06 03:56:19

0

C预计while()子句的条件为整数。如果整数为零,则会退出while循环,否则将执行它的正文并再次评估条件。各种各样的东西都以C为整数,包括字符。字符(空字符)等于整数0

0

在C中,任何非零值都视为true。

0

这是一个用来迭代C字符串的习惯用语,因为C字符串被定义为NUL终止。这是可行的,因为NUL字符\0的值为零,如您所知,值为零将导致while()循环终止。

0

由于在C最常见的串类型是零终止的字符串是有意义的循环像这样有时

while(*ptr) 
{ 
    printf("%c", *ptr); 
    ptr++; 
} 

遇到空字符,直到其基本上从字符移动到字符中的字符阵列。当然这是不好的形式,因为'\0',null0在给定的系统上不需要是相同的,但是在99%的环境中工作。

+0

不,这是保证工作100%。一个空字符结束符将始终是零关于布尔构造。一个NULL指针可能不物理上包含所有零位,但总是在逻辑上等于0. – CashCow 2011-02-06 04:01:08

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++); 

益智更简洁地写:你可以这样写更简洁还是?

相关问题