我一直很笨拙,由于我自己的过错而遇到了一个错误。基本上:
#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
答案 0 :(得分:3)
答案 1 :(得分:3)
如果您选中operator precedence,则会看到!(Logical NOT)
将首先得到评估,因此
!a < b
将被解析为(!a) < b
自a != 0
,(!a) => false
它变成false < b
,与0 < b