C 为什么我可以分配结构但不能比较它们

C 为什么我可以分配结构但不能比较它们,c,struct,compare,assign,C,Struct,Compare,Assign,尽管我是一名长期的C程序员,但我直到最近才了解到,可以直接将结构变量分配给彼此,而不是使用memcpy: struct MyStruct a,b; ... a = b; /* implicit memcpy */ 虽然这对C来说有点“高级”,但它确实很有用。但为什么我不能做平等和不平等的比较: if (a == b) ... if (a != b) ... 标准是否有充分的理由排除这一点?或者这是一个不一致的-否则非常优雅的-标准 我不明白为什么我可以替换我的memcpy来完成干净的任务,但

尽管我是一名长期的C程序员,但我直到最近才了解到,可以直接将结构变量分配给彼此,而不是使用memcpy:

struct MyStruct a,b;
...
a = b; /* implicit memcpy */
虽然这对C来说有点“高级”,但它确实很有用。但为什么我不能做平等和不平等的比较:

if (a == b) ...
if (a != b) ...
标准是否有充分的理由排除这一点?或者这是一个不一致的-否则非常优雅的-标准

我不明白为什么我可以替换我的memcpy来完成干净的任务,但我必须保留那些丑陋的memcmp。

根据:

对于编译器来说没有好的方法 进行结构比较 (即,为 结构)这与 C的低级风味。简单的 可以进行逐字节比较 关于未使用内存中存在的随机位 结构中的“孔”(例如 填充用于保持对齐 后面的字段(正确)。逐场比较可能需要不可接受的数据量 大型结构的重复代码。 任何编译器生成的比较 无法与之相比 指针字段在所有 案例:例如,经常 适用于比较char*字段 使用strcmp而不是==

如果需要比较两种结构, 您必须编写自己的函数 要做到这一点,一个接一个地进行


我知道这是有充分理由的。我忘了建筑物上的洞了。谢谢。我理解这个论点。但是指针字段参数不是同样适用于赋值吗?padding参数是有意义的,但是指针比较位似乎非常虚假。是的,您可能希望为包含字符串指针的结构定义自己的比较函数,但对于独立指针也是如此。ie:您可能想使用strcmp而不是==来进行比较。“如果编译器跳过assignment上的填充,那将是非常愚蠢的……”。不一定。例如,如果末尾有填充,我认为编译器可以在赋值时跳过它。假设它是合法的,复制它是没有意义的。但是因为你已经仔细地编写了与平台无关的代码,所以你不知道在最后有填充,所以你的MEMCMP会用于<代码> siZeof(StultMyStult)字节,并且包括没有被复制的填充。你也可以考虑当你在结构中有联盟时会发生什么。工会很容易复制,但很难比较。当然,逐字段比较元素是浪费的,但是元素之间的大小/填充差异意味着不能只比较任何一个元素。确定哪些字节是填充的,哪些是相关的变得非常棘手。+1问了一个让我学到了一些东西的问题。