1

我写了这个函数:

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]

所以如果该功能有效,那就太好了,为什么它不起作用?我的意思是函数总是返回假,

4

2 回答 2

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 );
}

检查所有三个数组元素是否都为 0,如果它没有给出预期的结果,那么你的数组元素不是你期望的。

根据您的应用程序,您可能需要近似测试而不是严格相等。由于浮点数的性质,在数学上具有相同结果的不同计算导致浮点算术/微积分的不同结果并不罕见。通常差异很小(但它也可能变得很大,例如由于失去显着性/灾难性消除),因此经常将浮点值与容差进行比较。

也许用col[i] == 0近似零测试替换fabsf(col[i]) < epsilon是适合您目的的正确策略(epsilon取决于用例的适当值)。

于 2012-11-09T10:58:21.233 回答
1

如果要使编译器静音,则应添加括号以强制评估顺序。但是您的比较似乎是错误的;你不能那样做。你为什么不使用第一种形式?它更具可读性,并且工作正常,除了将浮点数与==运算符进行比较非常不安全。

于 2012-11-09T10:52:33.010 回答