或者不相等

时间:2011-03-30 11:28:41

标签: c++

为什么这样做?

#include <iostream>
#include <string>
using namespace std;
int main(){
string s="a";
if((s=="cm")||(s=="in")||(s=="ft")||(s=="m"))
        cout<<s+" Is an illegal value";
else
        cout<<"I like "+s;
        return 0;
} 

http://ideone.com/7pnYh

然后这不是

#include <iostream>
#include <string>
using namespace std;
int main(){
string s="a";
if((s!="cm")||(s!="in")||(s!="ft")||(s!="m"))
        cout<<s+" Is an illegal value";
else
        cout<<"I like "+s;
        return 0;
}  

http://ideone.com/TXUXA 我想要的答案是“我喜欢”。

6 个答案:

答案 0 :(得分:3)

在您的第二种情况s != "cm"中,当然会打印第一个cout。为了否定检查和逻辑保持不变,请这样做:

if((s!="cm")&&(s!="in")&&(s!="ft")&&(s!="m"))
        cout<<"I like "+s;
else
        cout<<s+" Is an illegal value";

答案 1 :(得分:3)

更具体地说,您未正确应用De Morgan's lawhttp://en.wikipedia.org/wiki/De_Morgan%27s_laws

答案 2 :(得分:1)

(s!="cm")||(s!="in")||(s!="ft")||(s!="m")

每个人都是如此,所以表达的确如此。

答案 3 :(得分:1)

为什么第二个输出“我喜欢”? 第二个示例中语句中的每个条件都是正确的,因此它进入if分支。即使只有一个是真的,它仍然会进入if分支,因为你正在使用OR。

答案 4 :(得分:1)

您正在尝试检查它是否与所有这些字符串不相等,而不是它是否与这些字符串的任何不相等。

使用,而不是

答案 5 :(得分:1)

否定改变了它背后的逻辑。这里有更多的理论http://en.wikipedia.org/wiki/Negation但基本上,在第二个例子中,你想检查没有条件匹配 - 这意味着你必须拥有&amp;&amp; (和)运算符而不是|| (或)