C逻辑或if

时间:2013-04-08 17:56:18

标签: c eclipse-cdt

我知道我在C方面不是很好,但我认为我能做到这一点:

if(strlen(type) == 0 || strcmp(type,"in")!=0 || strcmp(type,"out")!=0)

type来自char*,我已经用条件的第一部分测试了这段代码。它运行良好。如果我有条件的第二部分和{{1} }包含type没关系,但如果所有三个条件都可用,如果我输入"in",则不会跳过if。为什么?

2 个答案:

答案 0 :(得分:1)

您的代码:

if(strlen(type) == 0 || strcmp(type,"in")!=0 || strcmp(type,"out")!=0){
    " your code-1"
}
else{
    " your code-2"
}

相当于:

if(strlen(type) == 0 ){
    " your code-1"
}
else{
  if(strcmp(type,"in")!=0){
      " your code-1"   
  }
  else{
      if(strcmp(type,"out")!=0){
            " your code-1"   
      }
      else{
            " your code-2"
      }
  }
}

如果你有{em>第一个 if()执行,如果字符串type有某些东西,则点是,否则永远不会执行。因为空字符串( in else part )不能等于"in""out"。因此,如果字符串非空,您始终可以选择执行“code-1”,如果字符串为空(即length = 0 ),则无需执行任何操作。

编辑:

我认为你想要{if} type字符串是“in”然后执行“code-1”如果type为“out”则执行第二个code-2。喜欢:

if(strlen(type) == 0 ){

}
else{
  if(strcmp(type,"in")!=0){
      " your code-1"   
  }
  else{
      if(strcmp(type,"out")!=0){
            " your code-2"   
      }
  }
}
你可以这样做:

flag = 'o';// this will save string comparison  again
if(strlen(type) == 0 || strcmp(type,"in")==0 || 
                       strcmp(type,"out")!=0 && !(flag='?')){
   "code-1"
}
else{
       if(flag=='o'){ //no strcmp needed
          "code-2"
       }
}

Here I posted a Code根据我的逻辑运行:

:~$ ./a.out 
Enter string: in
in 
:~$ ./a.out 
Enter string: out
out 
:~$ ./a.out 
Enter string: xx
:~$ 

答案 1 :(得分:1)

如果type为空,或者type包含“in”或“out”,则会进行分支。

鉴于表达式a || b,以下情况属实:

  • 操作数从左到右进行评估,这意味着首先评估a;
  • 如果a评估为非零(true),则整个表达式的计算结果为true,而b 未评估;
  • 如果a评估为零(false),则评估b;
  • 如果ab都评估为零(false),则整个表达式的计算结果为false;否则,表达式的计算结果为true;

因此,如果type包含字符串“out”,那么

  • strlen(type) == 0评估为false,意味着我们评估
  • strcmp(type, "in") != 0,评估为false,意味着我们评估
  • strcmp(type, "out") != 0,评估为true,所以
  • 分支机构

根据你所说的你所期待的,听起来你觉得上次测试错了,你真的想要

if( strlen( type ) == 0 || 
    strcmp( type, "in" ) != 0 || 
    strcmp( type, "out" ) == 0 )
{                      // ^^ note operator
  ...
}

如果type为空,如果type包含“in”,或者type 包含“out”,则会进入分支。