【发布时间】:2011-07-17 18:31:43
【问题描述】:
我收到了一个让我非常困惑的家庭作业问题。问题是:
在 C++ 中,相等测试 == 可能是 应用于数组,但赋值 运算符 = 不能应用于 数组。解释原因。
这让我很困惑,因为我的理解是 == 运算符只会比较前两个元素的地址(如果两个数组实际上保存在不同的内存位置,当然会有所不同)。而= 运算符,当像array1 = array2; 一样使用时,只会导致array1 指向与array2 相同的内存位置。
我在这里缺少什么?似乎可以使用任一运算符,但两者都不会产生这些运算符通常想要的结果。
【问题讨论】:
-
有趣的是,== 适用于数组,但不适用于 std::vector!
-
@junjanes:
==确实适用于std::vector。对于数组==测试身份相等性(左右两侧是否是同一个数组),因为数组的==确实比较了数组初始元素的地址。当您想要测试数组是否“相等”时,这通常不是您想要的。对于vector,==可以满足您对相等比较的期望:它测试一个vector中的所有元素是否与另一个vector中的相应元素相等。 -
实际上很难解释为什么数组不可赋值。 “因为标准是这样说的”,显然,但他们很容易做到。做出这个决定的原因很古老,AFAIK 类似于:在 C 的初始设计期间,极有可能使数组名称实际上 be 指针,初始化指向自动存储。然后,分配是否应该复制数组或重新定位指针可能会令人困惑,因此不是这样做,而是排除了它,并且排除它的决定卡住了。这是 C++ 作业,还是历史作业? ;-)
-
想一想,也许它卡住了,因为在 C 中使数组可赋值需要一个额外的规则,即在赋值完成时数组不会衰减到指针,而该规则可能会更复杂一些比现有的非常简单的不会发生衰减的情况。 C89 标准相当简洁。
-
@Steve Jessop:也许还因为数组附加了一些元数据,例如数组大小。给定
char a[5]; char b[4]; a = b;会发生什么?sizeof(a)是什么?是否应该禁止分配?处理这些问题的最简单方法是确保它们永远不会出现。