我是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这是我的推论,只用&&代替和,然后用||代替而不是或,您会得到我的代码,但不幸的是它不起作用。
有人可以告诉我为什么我的逻辑错误吗?
答案 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
。 :)