在评估中使用多个“大于/小于”的比较器是否合适?

时间:2013-09-02 16:18:25

标签: c++ comparison

我试图通过在一次评估中使用多个greater-than (>)less-than (<)来查看变量是否在一个范围内。我不确定这是否有效。它似乎比using multiple =='s is illigal,但是它可以与&lt;和&gt;'s?

以下是我正在尝试做的一个例子:

if (bottomOfRange < variable < topOfRange) {
//Do stuff
}

我知道这个:

if (bottomOfRange < varialbe && variable < topOfRange) {
//Do stuff
}

有效,我只是在寻找一种更有效的比较方法。

这会评估我的意愿,还是会采取不同的行动?

2 个答案:

答案 0 :(得分:6)

没有。这段代码可能会根据变量的类型进行编译,但不会给出你想要的比较。它会:

  • 评估bottomOfRange < variable以给出布尔结果;
  • 将该结果提升为值为0或1的数字类型;
  • 将该值与topOfRange进行比较。

如果要将值与其他两个值进行比较,则需要写出两个比较:

if (bottomOfRange < variable && variable < topOfRange)

答案 1 :(得分:1)

假设bottomOfRangetopOfRange是内置类型,那么不,它不会完成任何有用的事情。

如果您想要足够严重,可以定义一个重载operator<的类型,以使其实际工作:

class range {
    int lower;
    int val;
    range(int lower, int val) : lower(lower), val(val) {}
public:
    bool operator < (int upper) {
        return lower < val && val < upper;
    }

    class start {
        int t;
    public:
        start(int t) : t(t) {}
        range operator < (int val) { return range(t, val); }
    };
};

#ifdef TEST

#include <iostream>

int main(){
    static char const *s [] = { "Out of range", "In range" };

    int variable = 20;
    range::start bottomOfRange(10);
    int topOfRange(30);

    if (bottomOfRange < variable < topOfRange)
        std::cout << "In range\n";
    else
        std::cout << "out of range\n";

    bottomOfRange = 30;
    topOfRange = 10;

    if (bottomOfRange < variable < topOfRange)
        std::cout << "In range\n";
    else
        std::cout << "Out of range\n";
}
#endif

结果:

In range
Out of range

警告:这主要是(纯粹?)作为古玩。虽然它显然支持你所要求的内容,但我对在我自己的代码中使用它非常犹豫,而且我并不是真的建议你在你的代码中使用它。