8
int main()
{
  unsigned int a=6;
  int b=-20;

  (a+b)>6?puts(">6"):puts("<=6");
}

It is clear to me how the ternary operator work in this code. I am not able to understand the addition of the signed and unsigned integer here.

Tried Running the code ,output is ">6", why?

4

4 回答 4

20

我认为OP对三元运算符并不感到困惑,它是一个不同的问题。

根据 C99 标准,第 6.3.1.8 节(“通常的算术转换”):

如果无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。

unsigned int并且int具有相同的等级,所以它相当于:

(a + (unsigned int)b > 6)

要修复它,您需要明确地向另一个方向投射,即:

((int)a + b > 6)

所以这就是输出将是 >6不是的原因 <=6

于 2013-10-18T10:09:01.823 回答
9

其他两个答案准确地描述了三元运算符,但我认为这与问题更相关

输出是>6因为也(a + b) 转换b为 unsigned int

编辑:

请参阅 Acme 的解决此问题的建议。本质上作为a一个int将解决这个问题

于 2013-10-18T10:09:10.443 回答
5

您的代码的简单形式如下:

if(a + (unsigned int)b > 6)
{
    puts(">6")
}
else
{
    puts("<=6");
}

输出将是:

>6 as (a + (unsigned int)b > 6)
于 2013-10-18T10:09:58.713 回答
5

因为4294967282>6是真的,你会得到>6输出。4294967282来自分配-14给 a unsigned int(a+b)将转换为2^32 - 14. `

于 2013-10-18T10:12:03.913 回答