1

这是我的代码:

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

4

2 回答 2

4

While 要求条件是布尔值并且!isZero已经是布尔值。等式运算符生成一个布尔值,所以又isZero == false是一个布尔值。因此,您唯一更改的是添加另一个运算符并(可能)稍微减慢循环速度(AFAIR 比较比位运算符慢)。

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

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

至于 int 到 bool 的转换,标准说,

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

于 2013-05-21T06:01:24.320 回答
0

C++ 对条件的要求非常宽松。它接受布尔值,并将任何整数隐式转换为布尔值(其中 0 为假,非零为真),它还将任何指针隐式转换为布尔值(因为指针是无符号整数。在这种情况下,NULL为假,任何其他指针为真)。因此,以下都评估为真,所以 while 将执行。

int i = 4;
char c = '0';
bool b = true;
void * p = 0xdeadbeef;
while (i) // ...
while (c) // ...
while (b) // ...
while (p) // ...

虽然以下内容不会评估为真,但不会执行。

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

于 2013-05-21T06:07:10.697 回答