#include <stdio.h>
int main(void)
{
unsigned int a = 6;
int b = -20;
a + b > 6 ? puts("> 6") : puts("<= 6");
}
我很清楚三元运算符在这段代码中是如何工作的。 我无法理解这里
signed
和 unsigned
整数的相加。
运行此代码时,输出为
> 6
;为什么?
我认为OP并没有对三元运算符感到困惑,这是一个不同的问题。
来自 C99 标准,第 6.3.1.8 节(“常用算术转换”):
如果具有无符号整数类型的操作数的等级大于或 等于另一个操作数的类型的等级,则该操作数 带符号整数类型转换为操作数的类型 无符号整数类型。
unsigned int
和 int
具有相同的等级,因此相当于:
(a + (unsigned int)b > 6)
要修复它,您需要显式地向另一个方向进行转换,即:
((int)a + b > 6)
所以这就是输出 将是
>6
和 NOT <=6
的原因
另外两个答案准确地描述了三元运算符,但我认为这与问题更相关
输出为
>6
,因为 (a + b)
也将 b
转换为 unsigned int。
编辑:
请参阅 Acme 的解决此问题的建议。本质上,将 a
转换为
int
将解决这个问题
4294967282>6
为真,您将得到
>6
作为输出。
4294967282
来自将
-14
分配给
unsigned int
。
(a+b)
将转换为
2^32 - 14
。 `
if(a + (unsigned int)b > 6)
{
puts(">6")
}
else
{
puts("<=6");
}
输出将是:
>6 as (a + (unsigned int)b > 6)