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

Ternary (conditional) expression has the wrong type

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

1.num = sign ? (int)va_arg(args, int) : (unsigned int)va_arg(args, unsigned int);

2.if (sign)
    num = (int)va_arg(args, int);
else    
    num = (unsigned int)va_arg(args, unsigned int);

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

第二个按预期工作。

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

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

If both the second and third operands have arithmetic type, the result type that would be determined by the usual arithmetic conversions, were they applied to those two operands, is the type of the result.

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

如果您没有意识到这种奇怪的情况,这可能会导致奇怪的错误:

#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 优于 ?: 的原因。