if 语句和关系运算符和比较运算符:"Exceptions" 比较三个 values/variables 时

if statements and relational and comparison operators: "Exceptions" When comparing three values/variables

上下文

参加了 c++ 课程后,出现了 if 语句以及关系运算符和比较运算符。我不知道足够的 c++ 词汇,所以如果之前有人问过这个问题,我深表歉意。我试着四处寻找,但我什么也没找到。

问题

下面举例说明了我的困惑。

int n = 1;

if(2 < n <1){
    cout << n << endl;
}

当程序为 运行 时,cout 语句被打印到控制台(这让我很惊讶)。

问题

C++ 如何解释 if 语句中的值以及关系和比较运算符?

如果某处记录了任何其他有趣的“异常”,请您为我参考一下,谢谢。

答案尝试

我不太确定发生了什么。在我看来中间的数字似乎被跳过了?

玩了几次数字后,我现在可以确认中间的数字被跳过了,但我不知道为什么。

如果我通过放大问题来添加参数:

if(2 < n < 0 <1){
    cout << n << endl;
}

还有:

if(2 < n < 1 < 1 < 1){
    cout << n << endl;
}

现在我真的很困惑。似乎中间的任何“东西”都被忽略了。但是当 n = 3 导致 if 语句为“false”时,我发现我的模式有一个例外:

int n = 3 
if(2 < n < 1 < 1 <1){
    cout << n << endl;
}

但是如果我将 n 更改为看起来像“任何”(并非详尽无遗)的其他数字,则 if 语句将再次产生 true。

2 < n < 1 没有按照您的想法去做:

Because these operators group left-to-right, the expression a<b<c is parsed (a<b)<c, and not a<(b<c) or (a<b)&&(b<c) - cppreference.com

2 < n 部分将 return 一个布尔值,该值将在 < 1.

中进行比较
2 < n < 1;
// equal to 
(2 < n) < 1;

所以,总的来说,2 < n < 1 的流向是这样的:

  • (2 < n) < 1。 n 大于 2 吗?不,return false.
  • false < 1falsepromoted to an integer,为0。0小于1吗?是的,if条件是true.

这就是为什么当 n == 32 < n < 1 < 1 < 1 时,总的来说你得到 false:

  • (2 < 3) < 1 < 1 < 1。 3大于2吗?是的! Returns 1 (true)
  • (1 < 1) < 1 < 1。 1小于1吗?不! Return 0 (false)
  • (0 < 1) < 1。 0小于1吗?是的! Return 1 (true)
  • 1 < 1。 1小于1吗?不! Return 0 (false)

如您所见,这是荒谬的。为了使其正常工作,您必须进行明确的检查:

(n < 2) && (n > 1)
// is n less than 2 AND is n greater than 1