我尝试使用这个小代码在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语句中使用复合文字或语法不正确?
答案 0 :(得分:3)
您无法使用==
比较结构。
您应该分别比较结构的每个成员。
答案 1 :(得分:3)
为什么你不能使用==
运算符
引自C FAQ
编译器没有很好的方法来实现结构比较 (即支持结构的==运算符)是一致的 C的低级味道。 一个简单的逐字节比较即可 随机位的创始人出现在结构中未使用的“洞”中 (这种填充用于保持后面字段的对齐正确)。 逐场比较可能需要不可接受的数量 大型结构的重复代码。任何编译器生成的 不能期望比较指针字段 适用于所有情况:例如,通常适合 比较char *字段与strcmp而不是==。
如果你需要比较两种结构,你必须自己编写 功能这样做,逐字段。
答案 2 :(得分:1)
c没有提供语言功能来进行==结构的比较
答案 3 :(得分: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
。您必须使用==
和&&
单独检查字段,或者使用单独的不变结构与memcmp
进行比较。
虽然请记住后一个建议可能会与结构中的填充信息冲突,所以前者可能是最好的选择,除非你知道没有填充。