我有这段代码:
if(i!=j && i!=k && j!=k)
如何将其更改为循环,而不必手动检查其是否不相等?
答案 0 :(得分:0)
如果数组中有N个不同的变量
int v[N];
要检查它们是否都不同,必须比较每对。如果任何一对变量相等,则结果为false。
int result = 1;
for (size_t i = 0; i < N; ++i)
for (size_t j = 0; j < i; ++j)
if (v[i] == v[j])
result = 0;
如果可能会产生false
,则您可能希望提前终止:
int result = 1;
for (size_t i = 0; i < N; i++)
for (size_t j = 0; j < i; j++)
if (v[i] == v[j])
{
result = 0;
goto DONE;
}
DONE:
...
如果将代码组织为函数,则可以不使用goto
来编写代码:
bool are_all_different(int v[], size_t n)
{
for (size_t i = 0; i < n; i++)
for (size_t j = 0; j < i; j++)
if (v[i] == v[j])
return false;
return true;
}
如果性能对于您的应用程序非常重要,则可能需要将变量存储在hash table或bit map中。
答案 1 :(得分:0)
老实说,您不会得到任何更简单的,因为这几乎可以实现。除非您以某种方式将这些变量放入数组中,否则肯定无法循环执行此操作。
可以做的是通过封装比较并减少错误地给出其中一个变量的可能性,从而使语句的意图更易读。 >
这可以通过以下简单功能完成:
int ThreeDifferent(int a, int b, int c) {
if (a == b) return 1;
if (a == c) return 1;
return (b != c);
}
然后您只需使用以下命令即可调用该函数:
if (ThreeDifferent(i, j, k)) ...
这当然具有缺点,要求针对不同的参数计数使用特定的函数,但是就您的直接目的而言,这当然是一种选择。
如果您需要增加的可读性,我只建议 提出。您的原始代码可能几乎没有什么错,就是增加了一些空白无法解决:
if ((i != j) && (i != k) && (j != k))
答案 2 :(得分:-1)
如果您有大量要与另一个或多个值进行比较的值(例如来自传感器),则可能会有意义。一些示例函数
int AND_EQUAL(int *ValuesToComape, size_t size, int value)
{
int result = 1;
for(size_t index = 0; index < size && result; index++)
{
result = result && (ValuesToComape[index] == value);
}
return result;
}
int OR_EQUAL(int *ValuesToComape, size_t size, int value)
{
int result = 0;
for(size_t index = 0; index < size && !result; index++)
{
result = result || (ValuesToComape[index] == value);
}
return result;
}
int AND_GT(int *ValuesToComape, size_t size, int *values)
{
int result = 1;
for(size_t index = 0; index < size && result; index++)
{
result = result && (ValuesToComape[index] > values[index]);
}
return result;
}
int OR_GT(int *ValuesToComape, size_t size, int *values)
{
int result = 0;
for(size_t index = 0; index < size && !result; index++)
{
result = result || (ValuesToComape[index] > values[index]);
}
return result;
}