我对可能适用于几乎所有编程语言的条件语句感到困惑。 比如这个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}
答案 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'是一个字符并且有一个整数值。