【问题标题】:why do these two boolen expression give me different results?为什么这两个布尔表达式会给我不同的结果?
【发布时间】:2022-11-30 03:22:43
【问题描述】:

我正在尝试根据顺序比较两个数组的元素,例如:

bool compare_arr(int *a, int *b)
{
    for (int i = 0; i < 3; i++)
    {
        if (a[i] != b[i]) // !!!
        {
            return false; // !!!
        }
    }
    return true; // !!!
}

int main(void)
{
    int a[] = {2, 0, 4};
    int b[] = {2, 3, 4};
    if (compare_arr(a, b))
    {
        printf("arr elements are equal in order\n");
    }
    else
    {
        printf("arr elements are different in order\n");
    }
}

它给了我arr elements are different in order(右)

但是如果我改变布尔表达式:

bool compare_arr(int *a, int *b)
{
    for (int i = 0; i < 3; i++)
    {
        if (a[i] == b[i])
        {
            return true;
        }
    }
    return false;
}

它给了我arr elements are equal in order(错误)

在我看来,两个 bool 表达式具有相同的逻辑,但如您所见,结果不同。

【问题讨论】:

  • 如果遇到两个相等的元素(即使是第一个),第二个将立即返回 true。并且只有在以下情况下才会返回 false他们全部是不平等的。绝对不是你想要的。
  • 在这种情况下,调试器将是黄金!

标签: arrays c boolean


【解决方案1】:

展开循环,你会看到。

第一个相当于:

bool compare_arr(int *a, int *b)
{
    return !(a[0] != b[0]) && !(a[1] != b[1]) && ...
}

因为你需要通过全部迭代返回真。

第二个相当于:

bool compare_arr(int *a, int *b)
{
    return a[0] == b[0] || a[1] == b[1] || ...
}

因为你只需要正确传递返回 true。

简而言之,第一个函数意味着“对于所有对,元素相等”,而第二个函数意味着“对于至少一对,元素相等”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 2021-12-28
    • 2021-04-01
    • 2012-09-27
    相关资源
    最近更新 更多