"C" 三元运算符到 return 值时出错

Error on "C" ternary operator to return a value

我已经完成了这段代码,使用指数搜索算法搜索一个值

int exponential_search(int *array, size_t size, int value)
{
    size_t m = 1;
    size_t limit = 0;
    int out = 0;

    if (!array)
        return (-1);

    while (m < size && array[m] <= value)
    {
        printf("Value checked array[%ld] = [%d]", m, array[m]);
        m *= 2;
    }

    limit = (m < size) ? (m / 2) + 1 : size - (m / 2);
    out = binary_search(&array[m / 2], limit, value);

    return (out != -1) ? out + (m / 2) : -1;
}

当我使用 gcc -Wall -Wextra -Werror -pedantic 编译它时,我得到了这个错误信息:

error: signed and unsigned type in conditional expression [-Werror=sign-compare]
  return (out != -1) ? out + (m / 2) : -1;
                                     ^
cc1: all warnings being treated as errors

我不明白为什么

当我将“-1”更改为“1”时它起作用了,但我需要 return“-1”,此外,如果是,我不想使用 if/else 语句可能

您看到的 warning/error 是因为三元运算符的第二个和第三个操作数具有不同的类型,从而导致转换。

第二个操作数 out + (m / 2) 的类型为 size_t 因为这是 m 的类型,它执行到表达式的其余部分。第三个操作数 -1 的类型为 int。由于 ?: 运算符只能产生一种类型,因此通常的算术转换将应用于两种类型以确定类型。

因为无符号的size_t至少和int一样大,所以第三个操作数被转换为size_t。这意味着值 -1 被转换为无符号值,其结果将是一个非常大的正数(很可能是 264 - 1)。

当第三个操作数是 1 时你没有得到这个错误的原因是因为将 int1 转换为 size_t 不会改变它值,因为它在 size_t 的范围内,而 -1 不在。

您可以通过将 m 强制转换为 int 来阻止此转换。这将导致第二个操作数的类型为 int,因此第三个操作数不会被转换。

return (out != -1) ? out + ((int)m / 2) : -1;