if 语句以及关系运算符和比较运算符: "Exceptions" 比较三个值/变量时



上下文

学习c++课程,会出现if语句、关系运算符和比较运算符。我没有足够的c++词汇,所以如果以前有人问过我这个问题,我很抱歉。我试着四处寻找,但什么也没找到。

问题

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

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

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

问题

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

如果有任何其他有趣的";例外情况";像这样记录在某个地方,你能帮我参考一下吗,谢谢。

Ans尝试

我不完全确定发生了什么。对我来说,中间的数字似乎被跳过了?

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

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

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

以及:

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

现在我真的很困惑。这似乎是什么";事物;处于中间的被忽略。但当n=3时,我发现我的模式有一个异常,导致if语句为"0";false":

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

但如果我把n改成看起来像";任何";(并非详尽无遗(其他数字if语句将再次产生true。

2 < n < 1没有做你认为应该做的事情:

因为这些运算符从左到右分组,所以表达式a<b<c为解析的(a<b)<c,而不是a<(b<c)(a<b)&&(b<c)-cppreference.com

2 < n部分将返回一个布尔值,该值将在< 1中进行比较。

2 < n < 1;
// equal to 
(2 < n) < 1;

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

  • (2 < n) < 1。n是否大于2?否,返回false
  • CCD_ 11。false被提升为一个整数,即0。0是否小于1?是,if条件为true

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

  • (2 < 3) < 1 < 1 < 1。3是否大于2?对返回1(true(
  • (1 < 1) < 1 < 1。1小于1吗?不返回0(false(
  • (0 < 1) < 1。0是否小于1?对返回1(true(
  • 1 < 1。1小于1吗?不返回0(false(

正如你所看到的,这是毫无意义的。为了让它发挥作用,你必须进行明确的检查:

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

相关内容

  • 没有找到相关文章