检查值是否在if语句的范围内

时间:2013-01-21 07:09:50

标签: c++

我在下面做了:

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

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

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

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

2 个答案:

答案 0 :(得分:8)

第一个版本是evaluated like this

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

这就是为什么你收到关于bool的警告 - 你结束true/false <= '9'没有意义。

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

答案 1 :(得分:1)

正如其他人所解释的那样,优先顺序将表达式a <= b <= c分组为(a <= b) <= c,而第一部分评估a <= b - 通常需要返回布尔值true / false值。

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

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