有人可以向我解释为什么以下代码的输出表明数组不相等?
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;
}
答案 0 :(得分:58)
if (iar1 == iar2)
此处iar1
和iar2
衰减指向各个数组的第一个元素的指针。由于它们是两个不同的数组,因此指针值当然不同,并且您的比较测试不相等。
要进行逐元素比较,你必须要写一个循环;或者使用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
}
答案 1 :(得分:44)
由于还没有人提及它,您可以使用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))
答案 2 :(得分:14)
您没有比较数组的内容,而是比较数组的地址。由于它们是两个独立的数组,因此它们具有不同的地址。
使用更高级别的容器(例如std::vector
,std::deque
或std::array
)来避免此问题。
答案 3 :(得分:6)
数组不是基本类型,数组属于C ++内存中不同的地址。
答案 4 :(得分:1)
您正在比较地址而不是值。
答案 5 :(得分:1)
如果您不愿意将现有代码更改为std::array
,请使用几种方法,而不是non-type template arguments:
//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;
}
这是demo。请注意,在调用时,我们只需要传递数组变量,例如在你的情况下equal(iar1, iar2)
,不需要传递数组的大小。
答案 6 :(得分:1)
两者都将内存地址存储到两个不同阵列的第一个元素。这些地址不能等于输出地址。
答案 7 :(得分:0)
右。在 most 中,如果不是C的所有实现,则可以将数组标识符隐式地转换为指向第一个元素的指针(即第一个元素的地址)。你在这里做的是比较这些地址,这显然是错误的。
相反,您需要迭代两个数组,相互检查每个元素。如果两个人都没有失败就结束了,那么他们是平等的。
答案 8 :(得分:0)
当我们使用数组时,我们实际上正在使用指向数组中第一个元素的指针。因此,这个条件if( iar1 == iar2 )
实际上比较了两个地址。那些指针不会处理同一个对象。
答案 9 :(得分:0)
没有人提到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;
}
答案 10 :(得分: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)