1

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

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

type作为一个char*,我已经用条件的第一部分测试了这个代码。它运行良好。如果我有条件的第二部分并且我的type包含"in"它没关系,但如果所有三个条件都可用,如果我输入"out",如果没有被跳过。为什么呢?

4

2 回答 2

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"
      }
  }
}

关键是如果你首先 if()执行 if stringtype有什么东西,那么 else 永远不会执行。因为空字符串(在 else 部分)不能等于"in"or "out"因此,如果字符串不为空,则您始终可以选择执行“code-1” ,如果字符串为空(即 length = 0)则不执行任何操作。

编辑:

我想你想要类似的东西,如果type字符串是“in”然后执行“code-1”如果类型是“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"
       }
}

在这里,我根据我的逻辑发布了一个代码,它运行为:

:~$ ./a.out 
Enter string: in
in 
:~$ ./a.out 
Enter string: out
out 
:~$ ./a.out 
Enter string: xx
:~$ 
于 2013-04-08T18:32:59.773 回答
1

type如果为空,或者如果type包含“in”或“out” ,则将采用该分支。

给定表达式a || b,以下是正确的:

  • 操作数从左到右求值,意义a先求值;
  • 如果a计算结果为非零 (true),则整个表达式计算结果为 true,并且b 不计算
  • 如果a评估为零(假),则b评估;
  • 如果两者a和都b计算为零(假),则整个表达式的计算结果为假;否则,表达式的计算结果为真;

所以如果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” ,这将进入分支。

于 2013-04-08T18:45:31.957 回答