如何解析此条件?

时间:2018-08-04 03:53:46

标签: c++ conditional

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

#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语句始终评估为true。如果我将它包装在方括号中为!(a

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

if (!a < b)

a的浮点值为4.f,它是否将4.f从浮点值转换为布尔值(为true),然后将其取反为false,然后将假布尔值与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

2 个答案:

答案 0 :(得分:3)

尝试打印!a

std::cout << !a;

在C ++中,逻辑上取正(或负)值将为0。由于0小于4.0,因此为真。

this答案中还有其他信息。

答案 1 :(得分:3)

如果您选中operator precedence,则会看到!(Logical NOT)将首先得到评估,因此

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

a != 0(!a) => false

它变成false < b,与0 < b