这个条件是如何被解析的?
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
相同
我真的很笨拙,运行 由于我自己的错误而陷入了一个错误。基本上:
#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