我在下面做了:
if( '0' <= infix.at(i)<= '9'){
// some logic
}
编译器警告我在操作中不安全地使用“bool”类型。我将其更改为以下内容:
if( '0' <= infix.at(i)&& infix.at(i) <= '9')
现在它可以工作了。C ++中不允许第一个吗?
我在下面做了:
if( '0' <= infix.at(i)<= '9'){
// some logic
}
编译器警告我在操作中不安全地使用“bool”类型。我将其更改为以下内容:
if( '0' <= infix.at(i)&& infix.at(i) <= '9')
现在它可以工作了。C ++中不允许第一个吗?
第一个版本的评估如下:
if( ( '0' <= infix.at(i) ) <= '9' )
这就是为什么您会收到警告bool
-您最终会遇到true/false <= '9'
没有意义的警告。
某些语言允许您链接比较运算符,但 C++ 不是其中之一。
正如其他人所解释的那样,优先顺序将表达式分组a <= b <= c
为(a <= b) <= c
,并且评估的第一部分a <= b
- 通常预期返回布尔真/假值。
当然,如果a
和/或是b
用户定义的类型,您可以创建一个自定义operator<=
返回用户定义的对象而不是布尔值,并且它可以支持您想要的链接。(因此,Amber 的断言“某些语言允许您链接比较运算符,但 C++ 不是其中之一。”对于用户定义的类型来说是不正确的,但仍然是很好的建议 - 见下文)。您可以在运行时最轻松地进行链接(即通过返回一个对象,该对象保留bool
指示先前比较的结果以及形成 lhs 的值以进行进一步的链接比较),但也可以使用模板表达式和获得有效的短路评估。
这很少是一个好主意,因为其他程序员不会期望您的代码以这种方式进行评估。这会让他们感到非常困惑,而且当你几个月后回来维护代码时,你很可能会感到困惑,并且很可能会导致错误。无论如何,您不能支持对非用户定义类型的这种排序,而且对如何在表达式中混合值有这样的限制通常是有问题的。无意冒犯,但如果您需要问这个问题,您可能还没有准备好尝试实施此问题或应对风险。