gpt4 book ai didi

c - 相同的代码在 gcc 编译器和 Turbo C 中返回不同的值

转载 作者:行者123 更新时间:2023-11-30 18:02:07 25 4
gpt4 key购买 nike

当对大小为 2、有 2 个相同元素(例如 11,11)的数组执行以下代码时,两个编译器都会返回正确的数组上限和下限。但是当对 (1,1) 执行相同的操作时,gcc 返回 -1(不在数组中的数字)作为上限,而 Turbo C 则返回 1。

int binarylower(int a[],int m,int l,int u,int uorl)
{
int mid;

if(l<=u)
{ //finds the mid position
mid=(l+u)/2;
if (uorl == 1)
{
if(m==a[mid])
{
if ((m != a[mid-1])|| (mid == 0 && m==a[mid]))
{
return mid;
}
else
{
return binarylower(a,m,l,mid-1,1);
}
}
else if(m<a[mid])
{
return binarylower(a,m,l,mid-1,1);
}
else
{
return binarylower(a,m,mid+1,u,1);
}
}
else if(uorl == 2)
{
if(m==a[mid])
{
if ((m != a[mid+1]))
{
return mid;
}
else
{
return binarylower(a,m,mid+1,u,2);
}
}
else if(m < a[mid])
{
return binarylower(a,m,l,mid-1,2);
}
else
{
return binarylower(a,m,mid+1,u,2);
}
}
}
else
{
return -1;
}
}

最佳答案

代码中潜伏着一个问题

您的条件之一是:

if ((m != a[mid-1]) || (mid == 0 && m == a[mid]))

这并不能确保 mid-1 在范围内。另一个分支上的相应条件不会检查 mid+1 是否在范围内。因此,您的代码会探索它无权查看的数组部分,从而导致未定义的行为。

<小时/>

测试只能显示错误的存在,而不是不存在!

Dijkstra 说得非常明智。

我添加:

  1. else if (uorl == 2) 之后添加 else return -1;,以防止编译器发出有关函数未返回值的警告。

  2. 测试工具:

    #include <stdio.h>

    int main(void)
    {
    int array[] = { 11, 11 };
    printf("%d\n", binarylower(array, 11, 0, 1, 1));
    printf("%d\n", binarylower(array, 11, 0, 1, 2));
    return 0;
    }

使用 Mac OS X 上的 GCC,生成 0 和 1 作为答案,这看起来合理且正确。您的测试工具是什么样的?

更广泛的测试工具是:

#include <stdio.h>

int main(void)
{
int array[] = { 11, 11 };
printf("Array[0] = %d, [1] = %d\n", array[0], array[1]);
printf("%d Lo: %d\n", 10, binarylower(array, 10, 0, 1, 1));
printf("%d Hi: %d\n", 10, binarylower(array, 10, 0, 1, 2));
printf("%d Lo: %d\n", 11, binarylower(array, 11, 0, 1, 1));
printf("%d Hi: %d\n", 11, binarylower(array, 11, 0, 1, 2));
printf("%d Lo: %d\n", 12, binarylower(array, 12, 0, 1, 1));
printf("%d Hi: %d\n", 12, binarylower(array, 12, 0, 1, 2));

array[1] = 13;
printf("Array[0] = %d, [1] = %d\n", array[0], array[1]);
printf("%d Lo: %d\n", 10, binarylower(array, 10, 0, 1, 1));
printf("%d Hi: %d\n", 10, binarylower(array, 10, 0, 1, 2));
printf("%d Lo: %d\n", 11, binarylower(array, 11, 0, 1, 1));
printf("%d Hi: %d\n", 11, binarylower(array, 11, 0, 1, 2));
printf("%d Lo: %d\n", 12, binarylower(array, 12, 0, 1, 1));
printf("%d Hi: %d\n", 12, binarylower(array, 12, 0, 1, 2));
printf("%d Lo: %d\n", 13, binarylower(array, 13, 0, 1, 1));
printf("%d Hi: %d\n", 13, binarylower(array, 13, 0, 1, 2));
printf("%d Lo: %d\n", 14, binarylower(array, 14, 0, 1, 1));
printf("%d Hi: %d\n", 14, binarylower(array, 14, 0, 1, 2));

return 0;
}

输出是:

Array[0] = 11, [1] = 11
10 Lo: -1
10 Hi: -1
11 Lo: 0
11 Hi: 1
12 Lo: -1
12 Hi: -1
Array[0] = 11, [1] = 13
10 Lo: -1
10 Hi: -1
11 Lo: 0
11 Hi: 0
12 Lo: -1
12 Hi: -1
13 Lo: 1
13 Hi: 1
14 Lo: -1
14 Hi: -1

看起来无可挑剔。

关于c - 相同的代码在 gcc 编译器和 Turbo C 中返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9426171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com