1

我在下面做了:

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

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

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

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

4

2 回答 2

8

第一个版本的评估如下

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

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

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

于 2013-01-21T07:12:40.953 回答
1

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

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

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

于 2013-01-21T08:17:07.320 回答