"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
时你没有得到这个错误的原因是因为将 int
值 1
转换为 size_t
不会改变它值,因为它在 size_t
的范围内,而 -1
不在。
您可以通过将 m
强制转换为 int
来阻止此转换。这将导致第二个操作数的类型为 int
,因此第三个操作数不会被转换。
return (out != -1) ? out + ((int)m / 2) : -1;
我已经完成了这段代码,使用指数搜索算法搜索一个值
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
时你没有得到这个错误的原因是因为将 int
值 1
转换为 size_t
不会改变它值,因为它在 size_t
的范围内,而 -1
不在。
您可以通过将 m
强制转换为 int
来阻止此转换。这将导致第二个操作数的类型为 int
,因此第三个操作数不会被转换。
return (out != -1) ? out + ((int)m / 2) : -1;