【问题标题】:Is (val1 > val2 > val3) a valid comparison in C? [duplicate](val1 > val2 > val3) 是 C 中的有效比较吗? [复制]
【发布时间】:2016-12-03 05:43:40
【问题描述】:

我在创建函数时在 C 语言中搞砸了,结果以某种方式结束了这样的比较:

if (sizeAllocated > type_get_binary_size(data) > spaceAvailable)

(对我而言)出乎意料的是,编译时没有发出警告(使用用于 ARM 的 IAR 编译器,带有 IAR 扩展的 C99 标准)。
这看起来不应该是有效的 C (至少它不是我目前能想到的任何其他语言的有效比较),一些大师可以帮助我阐明这是否是一些特定于 IAR 的怪癖或如果它是实际的标准 C 语言太晦涩难懂而无法包含在任何常见的教程中?

【问题讨论】:

标签: c


【解决方案1】:

这是有效的代码,但它不会达到您的预期。

> 运算符是左结合的,所以表达式实际上变成了:

((sizeAllocated > type_get_binary_size(data)) > spaceAvailable)

如果条件为假,内部部分将评估为 0,如果条件为真,则评估为 1。然后将该值与spaceAvailable 进行比较。

在 C 语言中,比较运算符的结果是整数类型,因此将此结果与整数进行比较是有效的。

所以你实际在做的是0 > spaceAvailable1 > spaceAvailable,这取决于第一个条件的评估方式。

你可能想要的是这个:

int size = type_get_binary_size(data);
if ((sizeAllocated > size) && (size > spaceAvailable))

请注意,函数调用首先在 if 之前完成,因此它不会在条件中调用两次。

【讨论】:

  • 哇 - 这不是我所期望的,你说得对,我的意图是正确的。 IMO 这将是一种更有用的行为;如果我想要((sizeAllocated > type_get_binary_size(data)) > spaceAvailable) 比较,无论如何我都会用括号写它。感谢您的澄清!
  • 我怀疑 OP 需要 if ((sizeAllocated >= size) && (size >= spaceAvailable)) (>= vs >)
  • @chux 不,> 在这种情况下是正确的(但这对问题并不重要)
【解决方案2】:

> 运算符是左关联的,所以A > B > C解析(A > B) > CA > B 的计算结果为 0 或 1,因此您基本上是在比较 0 > C1 > C

【讨论】:

    猜你喜欢
    • 2019-05-16
    • 2015-12-04
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2011-06-02
    • 2016-01-04
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多