为什么会出现此错误?二进制表达式 [duplicate] 的操作数无效

Why do I get this error? invalid operands to binary expression [duplicate]

提问人:Jason 提问时间:10/25/2023 更新时间:10/25/2023 访问量:117

问:

我想检查 2 个结构指针是否指向相同的值,但出现此错误:

./07ex.c:158:15:错误:二进制表达式(“RGB”(又名“结构RGB_”)和“RGB”的操作数无效 返回 *x == *y; 下面是结构和函数:

typedef struct RGB_ {
    float r; 
    float g; 
    float b; 
} RGB;

bool point_to_equal_values_struct(RGB *x, RGB *y) {
    return *x == *y;
}

我通过这样做来度过难关:

bool point_to_equal_values_struct(RGB *x, RGB *y) {
    if ((*x).r == (*y).r && (*x).g == (*y).g && (*x).b == (*y).b)
    {
        return true;
    }       
    return false;
}

但是,我仍然很好奇为什么编译器会给出这个错误。 提前致谢!

C 布尔运算

评论

0赞 CherryDT 10/25/2023
如果这是C++,我会说“你没有在你的类上定义任何东西”。在 C 语言中,你甚至不能重载运算符,所以你必须编写一个函数来比较两个结构体。operator==RGBis_rgb_equalRGB

答:

4赞 dbush 10/25/2023 #1

运算符未定义为处理结构,因此无法直接比较两个结构。==

您需要像以前一样比较相应的字段。在侧节点上,您可能希望使用运算符来访问指针引用的结构的成员,因为它更易于阅读:->

if (x->r == y->r && x->g == y->g && x->b == y->b)
0赞 2 revs0___________ #2

除了@dbush答案之外,您还可以在结构被打包的情况下:

if(!memcmp(x,y, sizeof(*x)))
{
   /* do something */
}

成员访问包装结构可能非常昂贵,并且效率更高。memcpy

评论

0赞 dbush 10/25/2023
由于填充,这不能保证有效。
0赞 Aconcagua 10/25/2023
一般不行!!在这种特定情况下,是的,因为所有成员都具有相同的大小,并且不会添加填充字节(通常,至少,但这又不能保证!但是,如果大小不同,则可能会发生这种情况,并且这些填充字节的内容不确定,但它们包含在比较中!
0赞 0___________ 10/25/2023
@dbush电话分散了我的注意力。我的意思是打包的结构,单个成员访问可能很昂贵。