条件语句在比较表达式时的基础是什么?



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

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

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

while(*ptr++)

编译器认为除 NULL 之外的所有字符均为真。所以在这种情况下说只有 NULL 是错误的吗?对角色这样做可以吗?

if('x'){do something}
while(*ptr++)

会一直持续到ptr不指向这个字符串的末尾,这是(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";
   }
}

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

如果('x')是完全有效的,但它将始终被认为是正确的。

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

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

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

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

最新更新