将变量与值范围进行比较

时间:2010-09-30 12:55:18

标签: c++

在数学中,符号18 < age < 30表示年龄必须介于值18和30之间。是否可以在if语句中使用这种表示法?例如,我尝试过执行

if(18 < age < 30)

我得到奇怪的输出,所以它不太正确。有没有办法做到这一点,所以我只需要写

if(age > 18) /*blah*/;
else if(age < 30) /*same blah*/;

7 个答案:

答案 0 :(得分:12)

你可以这样做:

if (18 < age && age < 30) /*blah*/;

答案 1 :(得分:11)

没有人回答你的代码到底发生了什么,所以让我把它拆开。

考虑单一陈述:bool result = 18 < age < 30;

我们想要评估右手表达式:18 < age < 30

这个表达式中有两个运算符,由于它们是相同的,它们都具有相同的优先级,在这种情况下,它们从左到右进行求值,因此表达式相当于:

(18 < age) < 30

所以让我们首先检查左手成员:18 < age,它产生一个布尔值,该值为true或false,通常分别表示为1或0的整数值。因此表达式可以总结为:

{0,1} < 30

总是如此。

因此,如果您使用assert(18 < age < 30);,它将永远不会适得其反。

积分(和浮点)内置类型之间的隐式转换真的很烦人......

答案 2 :(得分:2)

  

是否可以在if语句中使用这种表示法?

是的,可能。

理想,几乎没有:程序员认为其他答案中描述的行为将始终适用,所以如果你戏剧性地改变评价的顺序和表达的意义那么它将真的很难混淆他们 - 迟早 - 导致悲伤。如果你有一个非常小的项目,只有很少的工作人员,他们基本上都希望用C ++创建一个特定于域的语言,使用这种表示法,域名的符号实际上更加可读和熟悉(也许他们是数学家而不是程序员),然后你可能在极端情况下会考虑我在下面提到的内容,尽管它仍然可能会造成麻烦。

我在几年前就将这种事情作为一种探索性的练习来实施。如果您希望这样做,但需要帮助入门:从我的头顶(即无疑的马车),请考虑:

struct Weird
{
    Weird(int n) : n_(n), b_is_meaningful_(false) { }
    Weird(int n, bool b) : n_(n), b_is_meaningful_(true), b_(b) { }

    int n_;

    bool b_is_meaningful_;
    bool b_;
};

Weird operator<(Weird lhs, Weird rhs)
{
    if (lhs.b_is_meaningful_)
        if (!lhs.b_) // effectively, anding with something already known false...
            return Weird(rhs.n_, false);
    return Weird(rhs.n_, lhs.n_ < rhs.n_);
}

基本上,你可以破解它,直到你可以:

Weird x = 10;
assert(6 < x < 20 < 30 < Weird(80));

在每个点上,operator<创建一个具有右侧(rhs)值的新Weird对象,同时在假设您有效地将一组比较。如果你真的想弄得一团糟,你可以用C ++支持各种各样的事情,你可能会说“x == 6 || 3 || 56”以获得乐趣......?

答案 3 :(得分:2)

一些模板代码可以在这里提供帮助:

template <int min, int max> class range {
  static bool contains(int i) { return min <= i  && i < max; } // In C++, ranges usually are half-open.
};

int age = 23;
if (range<18,30>::contains(age)) { /****/ }

答案 4 :(得分:0)

或者给自己写一套很好的功能来完成这个

template <typename type>
bool in_range_[none|both|low|high]<type>( value, min, max )

迎合所有类型的边界包括/不包括

(不要将它用于浮点)

在C ++ 0x中,你可以使用“delete”关键字允许和禁止所有其他可能性,该关键字禁用重载函数,例如&lt; float / double&gt;

答案 5 :(得分:0)

您可以将布尔表达式编写为

((18 < age) && (age < 30))

如果布尔表达式可以接受,可以使用上述表达式,例如(但不限于):

if((18 < age) && (age < 30)) { ... }

bool age_in_range = ((18 < age) && (age < 30));

请注意,上述表达式使用operator &&的{​​{3}}。

答案 6 :(得分:-1)

我知道没有办法完全按照你的要求做,但正常的方法是

使用和运算符

if(age> 18&amp;&amp; age&lt; 30)