这个条件是如何被解析的?

How is this conditional being parsed?

我真的很笨拙,运行 由于我自己的错误而陷入了一个错误。基本上:

#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 < b) 它会起作用。所以我知道我需要括号。

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

if (!a < b)

a有float值4.f,是不是把4.f从float值变成boolean值,为true,然后取反为false,再把false的boolean值和b比较,这是 6.f 浮点数?将假布尔值与 6.f 的浮点值进行比较会怎样?如果它将 6.f float 转换为布尔值,则 6.f 将变为 true,并且语句将是 if (false < true),这是没有意义的。这是它的工作方式吗?

我不确定它是否变成了 if (false < 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

尝试打印 !a

std::cout << !a;

在 C++ 中对正(或负)值取反将得到 0。由于 0 小于 4.0,因此为真。

this 答案中有更多信息。

如果你检查 operator precedence,你可以看到 !(Logical NOT) 将首先计算,所以

!a < b 将被解析为 (!a) < b

因为 a != 0(!a) => false

变成false < b,与0 < b

相同