逻辑运算符||和&&差异-我不断犯错

时间:2019-04-25 15:06:19

标签: c++

我是C ++的初学者,我在理解逻辑运算符&&和||时遇到麻烦。

例如,我有一个较小的任务,要编写一个函数,如果双精度向量为振荡(例如true),则返回1, 3, 2, 4, 3, 5, 4

我尝试了一个非常基本的解决方案。我做了一个for循环

for(int i=1; i<vec.size()-1; i++)

和一条if语句,该语句检查第i个位置的元素是否大于或等于其前任元素且大于或等于其后继元素,或者检查第i个位置的元素低于或等于其前任,并且小于或等于其前任

if ((vec.at(i) >= vec.at(i-1) && vec.at(i) >= vec.at(i+1))
 || (vec.at(i) <= vec.at(i-1) && vec.at(i) <= vec.at(i+1)))
   return false;

但是这不起作用!但是,如果我用&&代替||和||而不是&&它有效!为什么?这是我的逻辑:

如果满足两个子条件中的任何一个(由||分隔),则结果应为true,因为例如第二个元素大于第一个时,数字的向量就不会振荡。如果第二个元素小于第一个小于第二个

,则大于第三个, OR

这是我的推论,只用&&代替和,然后用||代替而不是或,您会得到我的代码,但不幸的是它不起作用。

有人可以告诉我为什么我的逻辑错误吗?

2 个答案:

答案 0 :(得分:3)

您对&&||的理解很好,但是您的推理不正确。如您所说:

  

第二个元素大于第一个元素并且大于第三个元素,或者如果第二个元素小于第一个元素并且小于第二个元素

...对于所有元素,您的向量是振荡。为了使向量不产生振荡,您需要至少一个i,其中任一为真:a[i - 1] <= a[i] <= a[i + 1]a[i - 1] >= a[i] >= a[i + 1]。用C ++术语:

if (a[i - 1] <= a[i] && a[i] <= a[i + 1] 
    || a[i - 1] >= a[i] && a[i] >= a[i + 1]) { /* ... */ }

您正在检查与想要的相反的地方,这就是为什么反转运算符的原因。

答案 1 :(得分:0)

  

结果应该为真

但是您却返回了false。 :)