int main()
{
unsigned int a=6;
int b=-20;
(a+b)>6?puts(">6"):puts("<=6");
}
我很清楚三元运算符如何在此代码中工作。我无法理解在这里添加签名和无符号整数。
尝试运行代码,输出为“&gt; 6”,为什么?
答案 0 :(得分:12)
我认为OP不会对三元运算符产生混淆,这是一个不同的问题。
根据C99标准,第6.3.1.8节(“常用算术转换”):
如果具有无符号整数类型的操作数的等级大于或等于 等于另一个操作数的类型的等级,然后是操作数 带符号整数类型转换为操作数的类型 无符号整数类型。
unsigned int
和int
具有相同的排名,因此它相当于:
(a + (unsigned int)b > 6)
要修复它,你需要明确地转向另一个方向,即:
((int)a + b > 6)
所以这就是输出 >6
和 NOT <=6
答案 1 :(得分:7)
另外两个答案准确地描述了三元运算符,但我认为这与问题
更相关输出为>6
,因为(a + b)
将b
强制转换为无符号整数。
编辑:
请参阅Acme关于解决此问题的建议。基本上施放a
作为int
将解决此问题
答案 2 :(得分:4)
您的简单形式代码如下:
if(a + (unsigned int)b > 6)
{
puts(">6")
}
else
{
puts("<=6");
}
输出将是:
>6 as (a + (unsigned int)b > 6)
答案 3 :(得分:4)
因为4294967282>6
为真,您将获得>6
作为输出。 4294967282
来自将-14
分配给unsigned int
。 (a+b)
将转换为2^32 - 14
。
`