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

时间:2013-10-08 03:43:43

标签: c++ c

我对可能适用于几乎所有编程语言的条件语句感到困惑。 比如这个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外,编译器认为所有字符都为true。所以说在这种情况下只有NULL是假的?用角色做这个也没关系?:

if('x'){do something}

3 个答案:

答案 0 :(得分: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有时被定义为不适合的东西,因此必须/必须避免。这些日子不太常见。

<强> Reference

修改

  

但为什么它接受像:('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";
   }
}

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

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