我在下面做了:
if( '0' <= infix.at(i)<= '9'){
// some logic
}
编译器在操作中警告我不安全使用'bool'类型。我将其更改为以下内容:
if( '0' <= infix.at(i)&& infix.at(i) <= '9')
现在可以了。是C ++中第一个不允许的吗?
答案 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以进行进一步链接比较的值),但也可以这样做它使用模板表达式并获得有效的短路评估。
这很少是一个好主意,因为其他程序员不希望以这种方式评估您的代码。它会让他们感到困惑,很可能你会在几个月后回来维护代码,并可能导致错误。无论如何,您都不能支持非用户定义类型的这种排序,并且对如何在表达式中混合值进行此类限制通常存在问题。没有违法行为,但如果你需要提出这个问题,你可能还没准备好尝试实施这个或导航风险。