作为比较操作数的结构不可用是C中更明显的事情之一,对我来说没有太大意义。结构可以按值传递并通过赋值复制,但==
未指定。C为什么在C中的平等表达式中不允许使用结构体?
以下是C11标准(草案)的相关部分,它们定义了等号运算符(==
和!=
)和简单赋值运算符(=
)的约束条件。请注意在平等运营商的限制下缺乏结构和联盟。 (除了缺少处理_Atomic
C99的措辞是相同的)。
6.5.9公平运营商
约束
下列情况之一的应持有:
- 两个操作数的算术类型;
- 这两个操作数都是指向兼容类型的合格或不合格版本的指针;
- 一个操作数是一个指向对象类型的指针,另一个是指向合格或不合格版本的void的指针;或
- 一个操作数是一个指针,另一个是空指针常量。
6.5.16.1简单赋值
约束
下列情况之一的应持有:
- 左操作具有原子,合格,不合格或算术类型,并右边有算术类型;
- 左操作数有一个结构或联合类型的原子,合格或不合格版本兼容右边的类型;
- 左操作数具有原子,合格,或不合格的指针类型;以及(考虑类型左操作数将具有左值变换后)两个操作数都指向兼容的类型的合格或不合格的版本,类型由指向左侧具有右侧指向的所有类型的限定符;
- 左操作数具有原子性,限定性或非限定性指针类型,并且(考虑左操作数在左值转换后将具有的类型)一个操作数是指向对象类型的指针,另一个是指向合格或void的非限定版本,左侧指向的类型具有右侧指向的所有类型的限定符;
- 左操作数是一个原子,限定或不合格的指针,右边是一个空指针常量;或
- 左操作数具有类型原子,限定或不合格的_Bool,右边是一个指针。
任何人都可以解释为什么这种差异存在(没有猜测)?
唯一可以回答你而没有投机的人会是Brian Kernighan –
嗯,是的,但他可能在前一段时间已经解释过......并且证明这可能很难挖起来,但这基本上是我想看到的。 K或者ISO委员会的某个人的推理,如果它曾经在那里讨论过(不必由*他们亲自对SO:D进行讨论)。 K&R有没有关于这个问题的事情? - 抱歉重复BTW:由于平等/比较差异(我的官方措辞:P),它没有出现在我的搜索中。 – stefanct
@MM没有必要纠缠Kernighan先生(他并没有参与C的第一次创建),咨询C的基本原理就足够了:https://stackoverflow.com/a/47056810/584518 – Lundin