“ C”三元运算符返回变量时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“ C”三元运算符返回变量时出错相关的知识,希望对你有一定的参考价值。

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

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”时,它可以工作,但是我需要返回“ -1”,此外,如果可能,我不想使用if / else语句

答案

您看到的警告/错误是因为三元运算符的第二和第三操作数具有不同的类型,导致转换。

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

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

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

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

这是警告。

您可以将无符号操作数显式转换为带符号的形式>

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

由于通常的算术转换,因此无需强制转换表达式out + (m / 2)的大小为size_t。在这种情况下,表达式-1也将被解释为size_t类型的大值。因此,编译器警告您,这也许不是您的意图。

以上是关于“ C”三元运算符返回变量时出错的主要内容,如果未能解决你的问题,请参考以下文章

即使在三元运算符中给出的左值很好,赋值语句也会出错

三元运算

来自 initializer_list 的三元运算符 + C++11 构造函数

返回引用时的 C++ 三元运算符

在格式化字符串(又名插值字符串)中使用三元运算符时出错 [重复]

C ++中的三元运算符奇怪的行为