【问题标题】:Checking if a value is within a range in if statment [duplicate]检查值是否在if语句的范围内[重复]
【发布时间】:2013-01-04 05:26:56
【问题描述】:

我在下面做了:

if( '0' <= infix.at(i)<= '9'){
// some logic
}

编译器警告我在操作中不安全地使用“bool”类型。我将其更改为以下内容:

if( '0' <= infix.at(i)&& infix.at(i) <= '9') 

现在可以了。 C++中不允许第一个吗??

【问题讨论】:

  • 不相关,但这些语句在 python 中工作很酷。

标签: c++


【解决方案1】:

第一个版本是evaluated like this:

if( ( '0' <= infix.at(i) ) <= '9' )

这就是为什么您会收到有关 bool 的警告 - 您最终会收到 true/false &lt;= '9' 这没有意义。

有些语言允许链接比较运算符,但 C++ 不是其中之一。

【讨论】:

    【解决方案2】:

    正如其他人所解释的那样,优先顺序将表达式 a &lt;= b &lt;= c 分组到 (a &lt;= b) &lt;= c 中,并且第一部分评估 a &lt;= b - 通常预期返回布尔真/假值。

    当然,如果a 和/或b 是用户定义的类型,您可以创建一个自定义的operator&lt;=,它返回一个用户定义的对象而不是布尔值,并且它可以支持链接你打算。 (因此,Amber 的断言“某些语言允许您链接比较运算符,但 C++ 不是其中之一。”对于用户定义的类型来说是不正确的,但仍然是很好的建议 - 见下文)。您可以在运行时最轻松地进行链接(即,通过返回一个保持 bool 指示先前比较结果的对象以及形成 lhs 的值以进行进一步的链接比较),但也可以使用模板表达式并获得有效的短路评估。

    这很少是一个好主意,因为其他程序员不会期望您的代码会以这种方式进行评估。这会让他们感到非常困惑,而且当你几个月后回来维护代码时,你很可能会感到困惑,并且很可能会导致错误。无论如何,您不能支持对非用户定义类型的这种排序,而且对如何在表达式中混合值有这样的限制通常是有问题的。无意冒犯,但如果您需要提出这个问题,您可能还没有准备好尝试实施此问题或应对风险。

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 2018-04-19
      • 2017-04-01
      • 1970-01-01
      • 2011-03-31
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多