我想知道在谓词中发生了什么?
我看到一些C while循环与谓词while(* ptr),而ptr通常是char *类型,这是如何工作的?这是否意味着“while()”也将接受除1或0以外的值作为谓词?我想知道在谓词中发生了什么?
在C中,任何非零值都被视为“真”,因此while (*ptr)
将循环,只要*ptr
为非零。
在C中,任何零都被认为是错误的,其他的东西都被认为是真的。该代码实质上是说“虽然ptr不为空”,给出以null结尾的字符串是走过字符串的常用方法。
确切地说错了。 0不正确。任何0都是错误的,其他的都是真的。 – dicroce 2011-02-06 03:47:32
确实,尴尬。我正在考虑过程编辑代码和成功。 :( – 2011-02-06 03:56:19
C预计while()
子句的条件为整数。如果整数为零,则会退出while循环,否则将执行它的正文并再次评估条件。各种各样的东西都以C为整数,包括字符。字符(空字符)等于整数0
在C中,任何非零值都视为true。
这是一个用来迭代C字符串的习惯用语,因为C字符串被定义为NUL终止。这是可行的,因为NUL字符\0
的值为零,如您所知,值为零将导致while()
循环终止。
由于在C最常见的串类型是零终止的字符串是有意义的循环像这样有时
while(*ptr)
{
printf("%c", *ptr);
ptr++;
}
遇到空字符,直到其基本上从字符移动到字符中的字符阵列。当然这是不好的形式,因为'\0'
,null
和0
在给定的系统上不需要是相同的,但是在99%的环境中工作。
不,这是保证工作100%。一个空字符结束符将始终是零关于布尔构造。一个NULL指针可能不物理上包含所有零位,但总是在逻辑上等于0. – CashCow 2011-02-06 04:01:08
让我们来稍微扩展一下。
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++);
益智更简洁地写:你可以这样写更简洁还是?
while(* ptr)其中ptr是一个字符串将失败时,该字符串恰好不是空终止。 – dicroce 2011-02-06 03:48:42