将变量与值范围进行比较

7 c++

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

if(18 < age < 30)
Run Code Online (Sandbox Code Playgroud)

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

if(age > 18) /*blah*/;
else if(age < 30) /*same blah*/;
Run Code Online (Sandbox Code Playgroud)

tib*_*bur 15

你可以做:

if (18 < age && age < 30) /*blah*/;
Run Code Online (Sandbox Code Playgroud)

  • 出于安全考虑,我想加上额外的括号.if((18 <age)&&(30> age)) (3认同)
  • @tibur,仍然,它使代码更容易阅读,并且对于vim的`ci(`:)更具有可塑性 (3认同)
  • 我在ManoJ R上加入括号.但我会这样做是为了可读性. (3认同)
  • 你说对了。可能会提到 `if( 18 &lt; age &lt; 30)` 是一个合法的 C++ 表达式,并解释它将如何计算。 (2认同)
  • 运算符“&lt;”在“&amp;&amp;”之前计算。所以不需要使用额外的括号。 (2认同)
  • @Manoj:在Lisp中没有关于运算符优先级的混淆,因此你不需要所有那些括号...嗯,没关系:) (2认同)

Mat*_* M. 15

没有人回答你的代码究竟发生了什么,所以让我把它拆开.

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

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

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

(18 < age) < 30
Run Code Online (Sandbox Code Playgroud)

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

{0,1} < 30
Run Code Online (Sandbox Code Playgroud)

这总是如此.

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

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


MSa*_*ers 5

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

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)) { /****/ }
Run Code Online (Sandbox Code Playgroud)