【问题标题】:C implicit conversion?C隐式转换?
【发布时间】:2016-02-12 12:07:58
【问题描述】:

谁能给我解释一下

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

打印出'-1'。我假设正在进行某种隐式转换,但我似乎无法理解它。

【问题讨论】:

  • 启用所有警告:“警告 C4308:负整数常量转换为无符号类型” 解释了该问题。
  • 现在解释为什么这段代码if( (-2 &lt; 2u ? 1u : -1) &gt; 0) { printf("-1 &gt; 0"); } 打印-1 &gt; 0 :)
  • @Lundin 你的意思是This
  • @Michi 显然你不能用-Werror set 编译有问题的代码:)
  • @Michi 我所做的细微调整是采用条件运算符,它始终将结果评估为第三个操作数 (-1),然后使第二个操作数无符号 (1u)。即使永远不会使用第二个操作数,但 ?: 运算符的第二个和第三个操作数之间存在隐式平衡,这在这种情况下会导致错误的结果。结论是?:操作符要谨慎使用。

标签: c implicit-conversion unsigned


【解决方案1】:

-2 正在转换为 unsigned integer。这将等于UINT_MAX - 1,绝对大于2。因此,条件失败并打印-1

【讨论】:

  • 所以u 将-2 和2 都转换为unsigned integer
  • @Nebeski 不,-2 到 unsigned int 的转换是隐式转换,如标题中所述。您无法直接比较有符号和无符号数量,因此将一个转换为另一个。
  • @Nebeski 研究“整数提升”和“通常的算术转换”。
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2017-04-11
  • 2015-08-12
  • 2010-12-12
  • 1970-01-01
相关资源
最近更新 更多