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 < 1
。 false
是promoted to an integer,为0。0小于1吗?是的,if
条件是true
.
这就是为什么当 n == 3
在 2 < 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
上下文
参加了 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 nota<(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 吗?不,returnfalse
.false < 1
。false
是promoted to an integer,为0。0小于1吗?是的,if
条件是true
.
这就是为什么当 n == 3
在 2 < n < 1 < 1 < 1
时,总的来说你得到 false
:
(2 < 3) < 1 < 1 < 1
。 3大于2吗?是的! Returns1
(true
)(1 < 1) < 1 < 1
。 1小于1吗?不! Return0
(false
)(0 < 1) < 1
。 0小于1吗?是的! Return1
(true
)1 < 1
。 1小于1吗?不! Return0
(false
)
如您所见,这是荒谬的。为了使其正常工作,您必须进行明确的检查:
(n < 2) && (n > 1)
// is n less than 2 AND is n greater than 1