我写了这个函数:
static bool colorIsEmpty(const Color col)
{
return (col[0] == 0 && col[1] == 0 && col[2] == 0 );
}
其中Color只是一个浮点数[3]; 如果col [3]全为0,则该函数不起作用; 但这很有效:
if(col[0] == col[1] == col[2] == 0) {
//gets called
}
然而gcc给了我警告:
cColorTest.c:212:5: warning: suggest parentheses around
comparison in operand of ‘==’ [-Wparentheses]
所以如果该功能有效,为什么它不起作用会很好? 我的意思是函数总是返回false,
答案 0 :(得分:4)
条件
if(col[0] == col[1] == col[2] == 0) {
是带括号的
if(((col[0] == col[1]) == col[2]) == 0) {
因此,如果col[0] == col[1]
,它会检查col[2] != 1
是否col[0] != col[1]
,如果col[2] != 0
,它会检查static bool colorIsEmpty(const Color col)
{
return (col[0] == 0 && col[1] == 0 && col[2] == 0 );
}
。我坚信这不是你想要的。
col[i] == 0
检查是否所有三个数组元素都是0,如果它没有给出预期的结果,那么你的数组元素就不是你期望的了。
根据您的应用程序,您可能需要进行近似测试而不是严格相等。由于浮点数的性质,在数学上具有相同结果的不同计算在浮点算术/微积分中导致不同的结果并不罕见。通常差异很小(但也可能变得很大,例如由于loss of significance/catastrophic cancellation),因此通常将浮点值与容差进行比较。
或许将fabsf(col[i]) < epsilon
替换为近似零测试,epsilon
是适合您目的的正确策略({{1}}的适当值取决于用例)。
答案 1 :(得分:1)
如果要使编译器静音,则应添加括号以强制执行评估顺序。但你的比较似乎是错误的;你不能这样做。你为什么不使用第一张表格?它更具可读性,并且工作正常,除了将浮点数与==
运算符进行比较是非常不安全的。