代码之家  ›  专栏  ›  技术社区  ›  Zebrafish

如何解析此条件?

  •  1
  • Zebrafish  · 技术社区  · 6 年前

    我真是笨手笨脚的,因为我自己的过错而碰上了虫子。基本上:

    #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<b)有效。所以我明白我需要括号。

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

    if (!a < b)
    

    a有浮点值4.f,它是否将4.f从浮点值转换为布尔值(这是真的),然后将其求反为假,然后将假布尔值与b(这是6.f浮点值)进行比较?如何比较伪布尔值和浮点值6.f?如果它将6.f float转换为布尔值,那么6.f将变成true,语句将是 if (false < true) ,这没有道理。这就是它的工作方式吗?

    我不确定是不是变成了 if(假<真) 因为:

    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应该变成真的。另一方面,如果我给中间变量赋值,情况就不同了:

    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 回复  |  直到 6 年前
        1
  •  3
  •   apple apple    6 年前

    如果你检查 operator precedence ,你可以看到 !(Logical NOT) 会先评估,所以

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

    自从 a != 0 , (!a) => false

    它变成 false < b 这和 0 < b

        2
  •  3
  •   Bill    6 年前

    试试打印!一

    std::cout << !a;
    

    逻辑上否定C++中的正(或负)值将给出0。因为0小于4.0,所以是真的。

    中有其他信息 this 回答。