使用循环使具有很多条件的if语句更简单

时间:2018-09-21 00:01:24

标签: c

我有这段代码:

if(i!=j && i!=k && j!=k)

如何将其更改为循环,而不必手动检查其是否不相等?

3 个答案:

答案 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 tablebit 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;
}