三元(条件)表达式的类型错误

时间:2017-06-14 03:52:06

标签: c gcc conditional-operator

我发现这两个实现不相等:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form5());
}

第一个实现,它总是选择假分支,无论 sign 是什么值。

第二个按预期工作。

这里发生了什么?我正在使用GCC / ARM GCC 64位

1 个答案:

答案 0 :(得分:4)

我猜你遇到的问题是在?:运算符中发生的微妙的隐式提升。第二和第三个操作数通过通常的算术转换相互平衡。这是C11 6.5.15的要求:

  

如果第二个和第三个操作数都有算术类型,则结果   由通常的算术转换确定的类型,   他们应用于这两个操作数,是结果的类型。

这意味着如果一个是有符号的而另一个是无符号的,则带符号的操作数将转换为无符号。无论第二或第三个操作数中哪一个被评估并作为结果使用,都会发生这种情况。

如果您不了解这种奇怪现象,这可能会导致奇怪的错误:

#include <stdio.h>

int main (void)
{
  int x;
  if( (-1 ? (printf("Expression evaluates to -1\n"),-1) : 0xFFFFFFFF) < 0)
  {
    printf("-1 is < 0");
  }
  else
  {
    printf("-1 is >= 0");
  }
}

输出:

Expression evaluates to -1
-1 is >= 0

这就是if/else优于?:的原因。