布尔变量用于循环和条件

boolean variables for loops vs conditions

本文关键字:条件 循环 用于 变量 布尔      更新时间:2023-10-16

下面是我的代码:

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

While要求条件为布尔值,而!isZero已经是布尔值。相等运算符生成一个布尔值,所以isZero == false也是一个布尔值。所以你唯一改变的是添加另一个操作符并(可能)减慢循环速度(事务比较比位操作符慢)。

对布尔值的操作类似于对整数值的操作。然后,您的关注点可以转化为整数:"嘿,x == 1不是万无一失的,我必须检查,x - 1 == 0是否"。

底线是,!isZero绝对是万无一失的。

对于int型到bool型的转换,标准规定:

算术、无作用域枚举、指针或指向成员类型的指针的右值可以转换为bool类型的右值。零值、空指针值或空成员指针值被转换为false;任何其他值都被转换为true。对于直接初始化(8.5),std::nullptr_t类型的右值可以转换为bool类型的右值;结果值为false。

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