循环与条件的布尔变量

时间:2013-05-21 05:50:50

标签: c++ while-loop boolean

这是我的代码:

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,在哪种情况下它代表任何非零数字?

2 个答案:

答案 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)。这是不必要的,但不会花费任何额外的处理器操作,并明确其意图。