0

我试过这个小代码在 IF 语句中使用复合文字:

#include<stdio.h>

struct time
{
    int hour;
    int minutes;
    int seconds;
};

int main(void)
{
    struct time testTimes;
    testTimes = (struct time){12,23,34};

    if (testTimes == (struct time){12,23,34})
        printf("%.2i:%.2i:%.2i\n", testTimes.hour, testTimes.minutes, testTimes.seconds);
    else
        printf("try again !\n");
    return 0;
}

它没有用。它在编译时给出了以下消息:

prac.c:15:16:错误:二进制 == 的无效操作数(具有“结构时间”和“结构时间”)

是否不允许在 IF 语句中使用复合文字或语法不正确?

4

4 回答 4

3

您不能使用 比较结构==

您应该分别比较结构的每个成员。

于 2012-05-09T07:35:33.213 回答
3

为什么不能使用==运算符比较结构是有充分理由的

引用C FAQ

编译器没有很好的方法来实现与 C 的低级风格一致的结构比较(即支持结构的 == 运算符)。一个简单的逐字节比较可以建立在结构中未使用的“洞”中存在的随机位上(这种填充用于保持后面字段的对齐正确)。对于大型结构,逐字段比较可能需要大量重复代码。不能期望任何编译器生成的比较在所有情况下都适当地比较指针字段:例如,将 char * 字段与 strcmp 而不是 == 进行比较通常是合适的。

如果您需要比较两个结构,则必须逐个字段编写自己的函数。

于 2012-05-09T07:40:37.543 回答
1

c 没有提供语言工具来进行结构的 == 比较

于 2012-05-09T07:36:08.637 回答
1

您无法比较结构。标准 ( C11 6.5.9 Equality operators) 规定:

One of the following shall hold:
- both operands have arithmetic type;
- both operands are pointers to qualified or unqualified versions of compatible types;
- one operand is a pointer to an object type and the other is a pointer to a qualified or unqualified version of void; or
- one operand is a pointer and the other is a null pointer constant.

struct time不幸的是,这些都不适用于 a 。您要么必须使用==和单独检查字段&&,要么拥有可以与 比较的单独不变的结构memcmp

尽管请记住,后一种建议很可能与结构中的填充信息相冲突,因此前者可能是最好的选择,除非您知道没有填充。.

于 2012-05-09T07:43:51.353 回答