【问题标题】:boolean variables for loops vs conditions循环和条件的布尔变量
【发布时间】:2013-05-15 19:21:33
【问题描述】:

这是我的代码:

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)
{ 
    ...
}

为什么或为什么不? 还有,在哪些情况下真代表1,在哪些情况下代表任何非零数?

【问题讨论】:

  • while (input) 怎么样?根本不需要isZero
  • true 是任何非零或转换为非零的东西。
  • 它们是一样的,我更喜欢while(!isZero)
  • 你也可以说while((izZero == false) == true)。别等了,这还不够万无一失!让它while(((izZero == false) == true) != false)。不用等...
  • @chris while(input) 在技术上是可行的,但在这种特殊情况下,我宁愿明确检查它:while (input != 0)。主要是因为程序员的意图会更清楚——读者不必知道某些特定的语言规范,例如int-to-bool 转换。除此之外,将ints 视为bools 是非常C 风格的IMO。

标签: c++ while-loop boolean


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    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) // ...
    

    虽然下面的结果不会为真,所以 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)。这是不必要的,但不会花费您任何额外的处理器操作,并且其意图是明确的。

    【讨论】:

    • 对于这段代码,如果执行了else条件,那么当在while(!notZero)处检查循环时,notZero的值不会被转回true,使得这是一个无限循环?
    • 在 OP 中给出的代码中,是的,如果执行 else 条件,isZero 将为 false,因此 while(!isZero) 将评估为 true,while 循环将继续。据推测,在... 部分中,input 已更改。当 input = 0 时,isZero 设置为 true,这将打破循环。
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2018-01-24
    • 2021-05-23
    • 2018-08-06
    • 2018-09-21
    相关资源
    最近更新 更多