在数学中,符号 18 < age < 30
表示年龄必须在18到30之间。是否可以在if语句中使用这种符号呢?例如,我尝试执行以下代码:
if(18 < age < 30)
我得到了奇怪的输出,所以它并不完全正确。有没有办法解决这个问题,或者我必须重新写代码?
if(age > 18) /*blah*/;
else if(age < 30) /*same blah*/;
在数学中,符号 18 < age < 30
表示年龄必须在18到30之间。是否可以在if语句中使用这种符号呢?例如,我尝试执行以下代码:
if(18 < age < 30)
我得到了奇怪的输出,所以它并不完全正确。有没有办法解决这个问题,或者我必须重新写代码?
if(age > 18) /*blah*/;
else if(age < 30) /*same blah*/;
您可以这样做:
if (18 < age && age < 30) /*blah*/;
if( 18 < age < 30)
是一个合法的 C++ 表达式,并解释它将如何被评估。 - John Dibling<
在 &&
之前被计算。因此不需要使用额外的括号。 - tiburci(
进行修改 :) - Alex B没有人回答您的代码出了什么问题,所以让我来分析一下。
考虑这个语句:bool result = 18 < age < 30;
我们想要评估右侧表达式:18 < age < 30
这个表达式中有两个操作符,并且它们相同,因此它们具有相同的优先级,在这种情况下,它们从左到右进行评估。因此,该表达式等价于:
(18 < age) < 30
让我们首先检查左侧的表达式:18 < age
,它产生一个布尔值,可以是true或false,通常分别表示为整数值1或0。因此,该表达式可以总结为:
{0,1} < 30
这个条件始终为真。
因此,如果使用 assert(18 < age < 30);
,它永远不会出错。
整数(和浮点数)内置类型之间的这种隐式转换真的很烦人...
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)) { /****/ }
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<
使用右手边的值创建一个新的 Weird
对象,并在假设您有效地将一组比较与起来的情况下更新布尔状态。如果你真的想搞乱,你可以在C++中支持各种各样的东西,比如说为了好玩尝试 "x == 6 || 3 || 56" ...?你可以将一个布尔表达式写成
((18 < age) && (age < 30))
像上面这样的表达式可以在任何需要布尔表达式的地方使用,例如(但不限于):
if((18 < age) && (age < 30)) { ... }
或者
bool age_in_range = ((18 < age) && (age < 30));
operator &&
的短路求值。(18 < age)
为 false
,那么第二个表达式就不会被计算。 - Arunage
要么是基本类型,要么是一个重载了operator<
的类),所以这完全不相关! - Oliver Charlesworth或者自己编写一组能够实现此功能的好函数
template <typename type>
bool in_range_[none|both|low|high]<type>( value, min, max )
为了适应所有类型的边界(包括/不包括)
(不要用于浮点数)
在C++0x中,您可以使用“delete”关键字来禁用函数重载,例如<float/double>,从而允许或禁止所有其他可能性。
我不知道有没有办法完全按照你的要求做,但通常的方法是:
使用 and 运算符
if (age > 18 && age <30)