【问题标题】:How is this conditional being parsed?如何解析这个条件?
【发布时间】:2019-01-11 21:59:50
【问题描述】:

我真的很笨拙,由于我自己的错而遇到了错误。基本上:

#include <iostream>

float a = 4.f;
float b = 6.f;

int main()
{
    if (!a < b)
    {
        std::cout << "a is not less than b";
    }
    else std::cout << "a is less than b";

    std::cin.ignore();
    return 0;
}

所以这个条件 if 语句总是计算为真。如果我将它用括号括起来 !(a

我的问题是我的错误示​​例是如何解析的?

if (!a < b)

a有float值4.f,是否将4.f从float值转为boolean值,即为真,再取反为假,再将假的boolean值与b比较,即6.f漂浮?它将如何将错误的布尔值与浮点值 6.f 进行比较?如果它将 6.f 浮点数转换为布尔值,则 6.f 将变为 true,并且语句将为 if (false &lt; true),这没有意义。这是它的工作方式吗?

我不确定它是否转向if (false &lt; true),因为:

float a = 4.f;
float b = -50.f;

int main()
{
    if (!a < b)
    {
        std::cout << "a is not less than b";
    }
    else std::cout << "a is less than b";

    std::cin.ignore();
    return 0;
}

总是以错误告终。我认为应该将 -50.f 设置为 true。另一方面,如果我分配给中间变量,情况就不同了:

float a = 4.f;
float b = -50.f;

int main()
{
    bool temp = b;
    if (!a < temp)
    {
        std::cout << "a is not less than b";
    }
    else std::cout << "a is less than b";

    std::cin.ignore();
    return 0;
}

现在总是如此。

感谢用户 apple apple 解决了这个问题,结果解析如下:

if (!a < b)
if (!4.f < 6.f) // Changes 4.f float to false boolean
if (false < 6.f) 
if (0.f < 6.f) // Promotes false boolean to 0.f

【问题讨论】:

  • @ShafikYaghmour 谢谢,现在阅读。这就是正在发生的事情吗?到底是不是变成了if(false
  • operator precedence 也可能有帮助
  • 我认为是(!a) &lt; b => false &lt; 6.f => 0 &lt; 6.f
  • @apple apple 我认为您是对的,并且与我给出的进一步示例一致。因此它将第一个浮点数转换为布尔类型,然后当它与浮点数进行比较时,它将布尔值提升为浮点数,这意味着它变为零。很有趣。

标签: c++ conditional


【解决方案1】:

如果您检查operator precedence,您可以看到!(Logical NOT) 将首先被评估,所以

!a &lt; b 将被解析为(!a) &lt; b

自从a != 0(!a) =&gt; false

变成false &lt; b,和0 &lt; b一样

【讨论】:

  • 一元运算符的优先级总是高于二元运算符
  • 变为 false
  • @Zebrafish BTW,(!0.0) &lt; 1.0 将是 false,因为 true 将转换为 1
  • 是的,真正的
【解决方案2】:

尝试打印 !a

std::cout << !a;

在 C++ 中对正(或负)值进行逻辑否定将得到 0。由于 0 小于 4.0,因此为真。

this 回答中有更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多