我知道我在C方面不是很好,但我认为我能做到这一点:
if(strlen(type) == 0 || strcmp(type,"in")!=0 || strcmp(type,"out")!=0)
type
来自char*
,我已经用条件的第一部分测试了这段代码。它运行良好。如果我有条件的第二部分和{{1} }包含type
没关系,但如果所有三个条件都可用,如果我输入"in"
,则不会跳过if。为什么?
答案 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
; a
和b
都评估为零(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”,则会进入分支。