C隐式转换?

5

有人能向我解释一下如何

printf("%d", -2<2u?1:-1);

打印出“-1”。我认为这里发生了某种隐式转换,但我似乎无法理解。


7
启用所有警告:"warning C4308: negative integral constant converted to unsigned type" 解释了这个问题。 - Weather Vane
1
现在解释一下为什么这段代码 if( (-2 < 2u ? 1u : -1) > 0) { printf("-1 > 0"); } 会输出 -1 > 0 :) - Lundin
@Lundin 你是指像这个一样的东西吗? - Michi
@Michi 显然你不能使用设置了"-Werror"的编译器编译有问题的代码 :) - Lundin
1
@Michi 我所做的微调是采用一个条件运算符,它总是将结果评估为第三个操作数(-1),然后使第二个操作数无符号(1u)。即使第二个操作数永远不会被使用,在 ?: 运算符的第二个和第三个操作数之间存在隐式平衡,这会导致在这种情况下产生错误的结果。结论是应谨慎使用 ?: 运算符。 - Lundin
显示剩余2条评论
1个回答

5

-2 被转换为 unsigned integer。这将等于 UINT_MAX - 1,而它肯定大于 2。因此,条件失败并打印出 -1


那么 u 在这里是将 -2 和 2 都转换为 无符号整数 吗? - Nebeski
3
@Nebeski 不,将-2转换为unsigned int是一种隐式转换,正如标题中所提到的那样。你不能直接比较有符号和无符号的量,因此一个量会被转换为另一个量。 - unwind
请学习“整数提升”和“通常的算术转换”。 - Lundin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接