这是我的代码:
int main()
{
int input;
bool isZero = false;
while (!isZero)
{
...
if (0 == input)
{
isZero = true;
}
else
{
isZero = false;
}
}
return 0;
}
程序做了它应该做的事情,但我觉得!isZero表达并非万无一失。
是
bool isZero = false;
while(!isZero);
{
....
}
与
相同bool isZero = false;
while(isZero == false)
{
...
}
为什么或为什么不呢? 此外,在哪种情况下,true表示1,在哪种情况下它代表任何非零数字?
答案 0 :(得分:4)
虽然要求条件为布尔值,!isZero
已经是布尔值。 Equality运算符生成一个布尔值,因此isZero == false
是一个布尔值。所以你唯一改变的是添加另一个运算符和(可能)减慢循环(AFAIR比较比位运算符慢)。
布尔值的操作类似于对整数值的操作。然后你的问题可以翻译成整数:“嘿,x == 1
并非万无一失,我必须检查{是x - 1 == 0
”。
最重要的是,!isZero
绝对是万无一失的。
对于int to bool转换,标准说,
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue。零值,空指针值或空成员指针值转换为false;任何其他值都转换为true。对于直接初始化(8.5),std :: nullptr_t类型的prvalue可以转换为bool类型的prvalue;结果值为false。
答案 1 :(得分:0)
C ++对条件的要求非常宽松。它接受布尔值,它会隐式地将任何整数转换为布尔值(其中0为假且非零为真),并且它还会隐式地将任何指针转换为布尔值(因为指针是无符号整数。在这种情况下,NULL将是假的,任何其他指针都是真的)。因此,以下所有都评估为true,因此while将执行。
int i = 4;
char c = '0';
bool b = true;
void * p = 0xdeadbeef;
while (i) // ...
while (c) // ...
while (b) // ...
while (p) // ...
虽然以下内容不会评估为true,但while不会执行。
int i = 0;
char c = '\0';
bool b = false;
void * p = NULL;
while (i) // ...
while (c) // ...
while (b) // ...
while (p) // ...
根据C ++,所有这些都是允许的。
当你在表达式中查看布尔值时,在其上放置==
运算符是多余的。无论上述b
是真还是假,说出while (b)
都是完全合理的,而且您不需要while (b == true)
。对于所有其他程序员,每个程序员都有自己的选择。我个人倾向于明确比较所有非布尔人。声明int i = 5; while (i)
在C ++中可能是合法的,但它只是没有清楚地阅读。我更愿意看int i = 5; while (i != 0)
。这是不必要的,但不会花费任何额外的处理器操作,并明确其意图。