C 如何在header中使用静态函数并与float数组进行比较

C 如何在header中使用静态函数并与float数组进行比较,c,gcc,C,Gcc,我写了这个函数: static bool colorIsEmpty(const Color col) { return (col[0] == 0 && col[1] == 0 && col[2] == 0 ); } 其中颜色只是一个浮点数[3]; 如果列[3]均为0,则函数不起作用; 但这是可行的: if(col[0] == col[1] == col[2] == 0) { //gets called } 然而,gcc给了我警告: cColor

我写了这个函数:

static bool colorIsEmpty(const Color col)
{
    return (col[0] == 0 && col[1] == 0 && col[2] == 0 );
}
其中颜色只是一个浮点数[3]; 如果列[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,

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

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

if(col[0] == col[1] == col[2] == 0) {
括号内

if(((col[0] == col[1]) == col[2]) == 0) {
因此,如果
col[0]==col[1]
,它将检查
col[2]!=1
,如果
列[0]!=列[1]
,检查列[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
值取决于用例)

if(col[0] == col[1] == col[2] == 0) {
括号内

if(((col[0] == col[1]) == col[2]) == 0) {
因此,如果
col[0]==col[1]
,它将检查
col[2]!=1
,如果
列[0]!=列[1]
,检查列[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
值取决于用例)。

您所说的“不工作”是什么意思?不建造吗?不计算你认为正确的结果吗?让你的电脑爆炸?我想警告会让你恼火。你说的“不工作”是什么意思?不建造吗?不计算你认为正确的结果吗?让你的电脑爆炸?我想警告会让你恼火。