Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将变量与一系列值进行比较_C++ - Fatal编程技术网

C++ 将变量与一系列值进行比较

C++ 将变量与一系列值进行比较,c++,C++,在数学中,18

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

if(18 < age < 30)
if(18岁<30岁)
我得到了奇怪的输出,所以不太正确。有没有办法做到这一点,或者说我只需要写一些东西

if(age > 18) /*blah*/;
else if(age < 30) /*same blah*/;
if(年龄>18岁)/*blah*/;
否则,如果(年龄<30岁)/*相同的废话*/;
您可以执行以下操作:

if (18 < age && age < 30) /*blah*/;
if(18岁<30岁)/*诸如此类*;

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

使用and运算符


if(age>18&&age或编写一组很好的函数来实现这一点

template <typename type>
bool in_range_[none|both|low|high]<type>( value, min, max )
模板
布尔值在|范围内|[无|均|低|高](值、最小值、最大值)
满足所有类型的边界包括/或不包括

(不要将其用于浮点)


在C++0x中,您可以使用“delete”关键字来允许和禁止所有其他可能性,该关键字禁用重载函数,例如

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

((18 < age) && (age < 30))
((18岁以下)和&(30岁以下))
可在任何布尔表达式可接受的情况下使用上述表达式,例如(但不限于):

if((18岁<30岁)和&(30岁<30岁){…}

bool年龄范围=((18岁以下)和&(30岁以下));

请注意,上面的表达式使用了
运算符&&

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

考虑一条语句:
bool result=18

我们要计算右侧表达式:
18

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

(18 < age) < 30
(18岁<30岁)
因此,让我们首先检查左边的成员:
18
,它生成一个布尔值,该布尔值要么为真,要么为假,通常分别表示为整数值1或0。因此表达式可以总结为:

{0,1} < 30
{0,1}<30
这总是正确的

因此,如果您使用
assert(18
它永远不会适得其反

整型(和浮点型)内置类型之间的这种隐式转换真的很烦人

在if语句中可以使用这种表示法吗

是的,有可能

令人满意,几乎永远不会:程序员假定其他答案中描述的行为将始终适用,因此如果您戏剧性地更改评估顺序和表达式的含义,那么这将严重混淆它们,迟早会导致悲伤。如果您有一个非常小的项目,员工很少,而且他们基本上都在关注G在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_);
}
struct
{
怪异(int n):n_n(n),b_是有意义的u(false){}
怪异(int n,bool b):n_u(n),b_是有意义的(真),b_u(b){}
int n_;
boolbou是有意义的;
布尔布尔;
};

奇怪的运算符一点模板代码可以帮助您:

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)) { /****/ }
模板类范围{

静态BoL包含(int i){min min,你的代码错误:如果年龄等于65?如果你执行的是BLAH,根据你的描述,你不是你所期望的。你可以得到它。可以提到,<代码>(18<年龄<30)< /C>是一个合法的C++表达式,并解释它将如何被评估。出于安全原因,我想增加额外的括号。(18age))@tibur,尽管如此,它使代码更易于阅读,并且对vim的
ci(
:)更具可塑性。我支持ManoJ R添加大括号。但我会这样做是为了可读性。@ManoJ:在Lisp中,对运算符优先级没有混淆,因此您不需要所有的大括号……嗯,没关系:)如果您习惯于将右值放在运算符的左侧,为什么不也放在运算符的左侧(年龄<30岁)?我更喜欢按数字行上的顺序写数字的比较。我不同意上述表达式“使用短路评估”的概念;他们不依赖于这种行为。可能我错了,但我认为如果年龄导致第一个表达式
(18
false
,则第二个表达式不会被计算。你是对的,但这两个表达式都没有任何副作用(假设
age
是一个基本类型,或者是一个类,具有
运算符的合理重载。您是否尝试过成功构建/运行这些代码?我已经尝试过类似的方法,但在重载比较运算符时,我仍然存在语言限制问题。它们应该总是返回我没有预料到的bool。它可能会对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));
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)) { /****/ }