【发布时间】:2016-12-09 17:18:40
【问题描述】:
我有一些 C 代码我想修改非常简单。
假设我有两个这样的数组
int v1[5] = {1, 3, 7, 13, 10};
int v2[2] = {1, 10};
我想打印不常见的元素(差异),例如:
3, 7, 13
这是我的尝试,但还不够:
#include <stdio.h>
int main()
{
int v1[5] = { 1, 3, 7, 13, 10 };
int v2[2] = { 1, 10 };
for (int i = 0; i < sizeof(v1) / (sizeof * v1); i++) {
for (int j = 0; j < sizeof(v2) / (sizeof * v2); j++) {
if (v1[i] != v2[j]) {
printf("%d ", v1[i]);
break;
} else {
break;
}
}
}
return 0;
}
这两个数组总是很短(最多 6 个元素)。他们没有订购,我不应该修改它们。它们中的每个元素都是唯一的,即每个数字在每个数组中只能出现 1 次。 v2 将仅包含 v1 中元素的子集。 实现这一目标的最有效方法是什么?
【问题讨论】:
-
首先,if(){}else{} 语句中的
break语句是什么?无论如何你执行它。你需要重新设计循环,break完全错误。 -
作为第二次优化,从 for() 语句中取出
sizeof(v1) / (sizeof * v1)和类似的语句:它执行每个周期并且它是恒定的。 -
@nopasara:
sizeof表达式在编译时进行评估并折叠,以便程序看到 2 和 5。不过,您的建议对于在字符串的循环中调用strlen很有用。 -
@M Oehm:我真的不知道 sizeof() 将如何评估,也不知道在编译期间如何处理除法,这取决于编译器。它只是一个古老的优化规则:尽可能早地计算一次常量值。我会这样做以防万一,不会有错误的地方。
-
元素的取值范围是多少?小数字还是整个
[INT_MIN...INTMAX]范围?
标签: c array-difference