58

有人可以向我解释为什么以下代码的输出说数组不相等吗?

int main()
{

    int iar1[] = {1,2,3,4,5};
    int iar2[] = {1,2,3,4,5};

    if (iar1 == iar2)
        cout << "Arrays are equal.";
    else
        cout << "Arrays are not equal.";

    return 0;   
}
4

11 回答 11

97
if (iar1 == iar2)

这里iar1iar2正在衰减到指向各个数组的第一个元素的指针。由于它们是两个不同的数组,因此指针值当然是不同的,并且您的比较测试也不相等。

要进行逐元素比较,您必须编写一个循环;或std::array改用

std::array<int, 5> iar1 {1,2,3,4,5};
std::array<int, 5> iar2 {1,2,3,4,5};

if( iar1 == iar2 ) {
  // arrays contents are the same

} else {
  // not the same

}
于 2012-10-12T20:18:16.470 回答
74

由于还没有人提到它,您可以将数组与std::equal算法进行比较:

int iar1[] = {1,2,3,4,5};
int iar2[] = {1,2,3,4,5};

if (std::equal(std::begin(iar1), std::end(iar1), std::begin(iar2)))
    cout << "Arrays are equal.";
else
    cout << "Arrays are not equal.";

您需要包括<algorithm><iterator>。如果你还没有使用 C++11,你可以这样写:

if (std::equal(iar1, iar1 + sizeof iar1 / sizeof *iar1, iar2))
于 2012-10-13T07:25:45.097 回答
15

您不是在比较数组的内容,而是在比较数组的地址。由于它们是两个独立的数组,因此它们具有不同的地址。

通过使用更高级别的容器(例如 、 或 )来避免std::vectorstd::deque问题std::array

于 2012-10-12T20:13:52.493 回答
6

数组不是原始类型,数组在 C++ 内存中属于不同的地址。

于 2012-10-12T20:13:41.237 回答
6

没人提memcmp吗?这也是一个不错的选择。

/* memcmp example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";

  int n;

  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );

  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

  return 0;
}

参考:http ://www.cplusplus.com/reference/cstring/memcmp/

于 2019-07-11T13:06:50.880 回答
4

如果您不愿意将现有代码更改为std::array,则使用几个方法来代替,它们采用非类型模板参数

//Passed arrays store different data types
template <typename T, typename U, int size1, int size2>
bool equal(T (&arr1)[size1], U (&arr2)[size2] ){
    return false;
}

//Passed arrays store SAME data types
template <typename T, int size1, int size2>
bool equal(T (&arr1)[size1], T (&arr2)[size2] ){
    if(size1 == size2) {
        for(int i = 0 ; i < size1; ++i){
            if(arr1[i] != arr2[i]) return false;
        }
        return true;
    }
    return false;
}

这是演示。请注意,在调用时,我们只需要传递数组变量,例如equal(iar1, iar2)在您的情况下,不需要传递数组的大小。

于 2017-09-29T05:04:31.417 回答
1

您正在比较地址而不是值。

于 2012-10-12T20:15:13.943 回答
1

两者都将内存地址存储到两个不同数组的第一个元素。这些地址不能相等,因此输出。

于 2020-05-02T00:03:55.423 回答
0

对。在大多数(如果不是所有的 C 实现)中,数组标识符可以隐式转换为指向第一个元素的指针(即第一个元素的地址)。您在这里所做的是比较这些地址,这显然是错误的。

相反,您需要遍历这两个数组,并相互检查每个元素。如果你在没有失败的情况下完成了两者,它们是平等的。

于 2012-10-12T20:14:37.123 回答
0

当我们使用数组时,我们实际上是在使用指向数组中第一个元素的指针。因此,这个条件if( iar1 == iar2 )实际上比较了两个地址。这些指针不指向同一个对象。

于 2012-10-12T21:49:15.280 回答
0

如果您愿意使用std::array而不是内置数组,您可以使用:

std::array<int, 5> iar1 = {1,2,3,4,5};
std::array<int, 5> iar2 = {1,2,3,4,5};

if (iar1 == iar2)
于 2020-11-30T23:27:23.787 回答