“ 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 构造函数