我发现这两个实现不相等:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form5());
}
第一个实现,它总是选择假分支,无论 sign 是什么值。
第二个按预期工作。
这里发生了什么?我正在使用GCC / ARM GCC 64位
答案 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
优于?:
的原因。