-1

我对可能适用于几乎所有编程语言的条件语句感到困惑。例如这个 C++ 代码:

int main()
{
   char *ptr, arr[]={'C','O','M','P','I','L','E','R','\0'};
   ptr = arr;
   *ptr = 'Z';
   while(*ptr++)
    cout << *(ptr-1);

   return 0;
}

据我所知,条件语句仅在表达式为真时执行。所以在这种情况下,这部分:

while(*ptr++)

编译器认为除 NULL 之外的所有字符都为真。那么在这种情况下说只有 NULL 是假的意思吗?可以对字符执行此操作吗?:

if('x'){do something}
4

3 回答 3

2
while(*ptr++)

将继续运行,直到 ptr 不指向该字符串的末尾,即\0(Null Terminator) ,此相同的语句还会在每次运行时递增 ptr 以指向下一个值,所以基本上它的意思是while this condition is true,继续。条件是while ptr still points to an element of arr

在 C++ 中,NULL 的定义是 0,所以只有审美上的区别。我更喜欢避免使用宏,所以我使用 0。NULL 的另一个问题是人们有时会错误地认为它不同于 0 和/或不是整数。在准标准代码中,NULL 有时被/被定义为不合适的东西,因此必须/必须避免。这几天不太常见了。

参考

编辑:

但为什么它接受诸如:while('x') 之类的参数?字母“x”是真的吗?

不,这并不意味着字母本身是正确的,这意味着它不是 NULL,即 0。像这样考虑它。

while('x')

相当于说

while('x'!=0)    // so that is perfectly acceptable and understandable

编辑2:

这是一个更简单的示例,您可以更好地理解

#include <iostream>


int main()
{
   int x=0;

   if(x)
   {
     cout<<"If this is shown, x was not 0.";
   }
   if(x==0)
   {
     cout<<"so does it mean x is true? no: It means your condition 'x==0' is true";
   }
}
于 2013-10-08T03:46:39.677 回答
0

在 C 中,除 0 以外的任何数字都被认为是真的。(0 为假)如果您使用 *prt++ 遍历数组,它会检查当前索引是否不为零并增加指针。

if('x')是完全有效的,但它总是被认为是真的。

(请记住 char 内部只是一个 8 位数字,0 用于终止字符串。在您提供的示例中,它用于迭代“字符串”)

是的,NULL 也被认为是错误的(因为指针指向的地址是 0),但是,在您提供的示例中,指针首先被取消引用,因此它检查它指向的位置。

于 2013-10-08T03:49:06.020 回答
0

这是 C 的遗物,任何非零的东西在测试时都会评估为布尔值 true,例如if ('x')上面的。x 有一个整数值,因为它是一个非零值的字符,因此表达式的计算结果为真。

在指针遍历字符数组的情况下,C 'strings' 总是以 '\0' 结尾,null,当指针到达那里时,while 将失败为 null == 0。不要与“0”混淆,因为“0”是一个字符并且具有整数值。

于 2013-10-08T03:51:48.663 回答