我们需要比较C中数组的每个元素吗?

use*_*316 5 c arrays

我有以下代码:

int isUsed[6] = {1,1,1,1,1,1};
Run Code Online (Sandbox Code Playgroud)

如何比较此数组中的所有元素是否等于1?还是其他价值?我知道我们可以循环数组并逐一比较它,但我们还有其他方法吗?

unw*_*ind 12

是的,你必须逐个元素地做.

如果你的数组只包含纯整数类型(即不是structs 的数组),你只想检查是否相等,你可以使用memcmp().

这当然是在内部循环,但它是一个预制的标准功能,因此它有助于提高可读性.它可能会损害性能,因为它比较了chars.另一方面(在评论之后)它可能会获得性能,因为它是一个可能被优化的着名库函数.

另外,为了完整性,我之所以注意struct上面没有s 的原因是结构通常包含填充字节,这将被"看到" memcmp()并且可能导致不正确的结果.

例如:

struct {
  int x;
  char y;
  int z;
} a = { 1, 2, 3 }, b = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

在许多系统上,上面struct会有y和之间的填充z,这可能会导致错误的结果,memcmp()因为填充字节有未定义的值.

  • @unwind memcmp**不进行400字节比较.查看好库的来源.它将使用机器的字大小,例如64位,进行比较.它将执行QWORD对齐的内存访问.你通常不能在一个简单的循环中击败它. (5认同)
  • @ johnchen902例如`int x [100],y [100];`,`memcmp()`必须进行400字节大小的比较(假设`sizeof(int)== 4`).比较`int`s的应用程序循环只需要100,这可能会有所不同.我说*可能*. (2认同)
  • @GrijeshChauhan不,我们不能.C中的结构没有`==`运算符.Assignment(`=`)是,但没有比较. (2认同)