C# 为什么一个变量对多个值的不相等检查总是返回true?
我的程序中有一个变量C# 为什么一个变量对多个值的不相等检查总是返回true?,c#,javascript,php,plsql,if-statement,language-agnostic,control-flow,multiple-languages,sql,python,java,java-9,C#,Javascript,Php,Plsql,If Statement,Language Agnostic,Control Flow,Multiple Languages,Sql,Python,Java,Java 9,我的程序中有一个变量v,它可以从值集中取任何值 "a", "b", "c", ..., "z" 我的目标是只在v不是“x”、“y”、或“z”时执行一些语句 我试过了 对于类C语言(等式运算符比较实际字符串值;例如,) if(v!=“x”| v!=“y”| v!=“z”) { //我想要执行的语句 //如果v既不是“x”,也不是“y”,也不是“z” } 对于类Pascal语言(例如) 如果(v!=“x”或v!=“y”或v!=“z”),则 --我想要执行的语句 --如果v既不是“x”,也不是“
v
,它可以从值集中取任何值
"a", "b", "c", ..., "z"
我的目标是只在v
不是“x”
、“y”
、或“z”
时执行一些语句
我试过了
- 对于类C语言(等式运算符比较实际字符串值;例如,)
if(v!=“x”| v!=“y”| v!=“z”) { //我想要执行的语句 //如果v既不是“x”,也不是“y”,也不是“z” }
- 对于类Pascal语言(例如)
如果(v!=“x”或v!=“y”或v!=“z”),则 --我想要执行的语句 --如果v既不是“x”,也不是“y”,也不是“z” 如果结束;
if条件中的语句始终执行。我做错了什么吗?使用
&
/和/和
,而不是|
/或:
v != "x" && v != "y" && v != "z"
问题
如果始终执行If
块,则If块的条件始终计算为true
。逻辑表达式一定是错的
让我们考虑<代码> v!=“x”| v!=“y”| v!=对于
v
的每个值,“z”
- 当
v=“x”
时
v!=“x”
变为“x”!=“x”
,这是错误的。
v!=“y”
变为“x”!=“y”
,这是真的。
v!=“z”
变为“x”!=“z”
,这是真的
表达式的计算结果为false | true | true
,即true
- 当
v=“y”
时,表达式变为
"y" != "x" || "y" != "y" || "y" != "z"
"z" != "x" || "z" != "y" || "z" != "z"
或者true | | false | | true
,这是真的
- 当
v=“z”
时,表达式变为
"y" != "x" || "y" != "y" || "y" != "z"
"z" != "x" || "z" != "y" || "z" != "z"
或者true | | true | | false
,这是真的
- 对于
v
的任何其他值,表达式的计算结果为true | true | true
,即true
可选地,考虑真值表:
│ A B C │
v │ v != "x" v != "y" v != "z" │ A || B || C
───────┼──────────────────────────────────┼──────────────
"x" │ false true true │ true
"y" │ true false true │ true
"z" │ true true false │ true
other │ true true true │ true
如您所见,逻辑表达式的计算结果总是true
解决方案
您要做的是,找到一个逻辑表达式,当
(v不是“x”)
和
(v不是“y”)
和
(v不是“z”)
正确的结构是,
- 对于类C语言(例如-(可能需要严格的相等运算符
!==
),)
if(v!=“x”&&v!=“y”&&v!=“z”)
{
//我想要执行的语句
//如果v既不是“x”,也不是“y”,也不是“z”
}
- 对于类Pascal语言
如果(v!=“x”和v!=“y”和v!=“z”)那么
--我想要执行的语句
--如果v既不是“x”,也不是“y”,也不是“z”
如果结束;
德摩根定律
通过,表达式也可以重写为(使用类似C的语法)
意义
不是((v是“x”)
或(v是“y”)
或(v是“z”)
这使得逻辑更加明显
特定语言
有些语言有特定的结构来测试集合中的成员资格,或者您可以使用数组/列表操作
- :
v不在('x','y','z')
- :
[“x”、“y”、“z”]索引(v)=-1
- :
v不在{“x”、“y”、“z”}
- :
- (及以上):
对于PHP,您可以使用如下内容:
if(strpos('xyz',$v[0])==false)//示例1
//当字母不在字符串中时,strpos返回false
//返回子字符串的位置(基于0)
//我们必须使用严格的比较来查看它是否不在子字符串中
if(!in_数组($v[0],数组('x','y','z'))//示例2
//例3
$out=数组('x'=>1,'y'=>1,'z'=>1)//创建一个数组
if(!$out[$v[0]])//检查它是否不是1
如果(!preg_match('/^[xyz]$/',$v))//示例4,使用正则表达式
if(str_replace(数组('x','y','z'),'',$v[0])//示例5
if(trim($v[0],'xyz')//示例6
对于Javascript:
if(~'xyz'.search(v[0])//示例1(.indexOf()也适用)
if(!(v[0]in{x:0,y:0,z:0}))//示例2
if(~['x','y','z'].indexOf(v[0])//示例3,与旧浏览器不兼容。
如果(!/^[xyz]$/.match(v))//示例4
if(v.replace(//^[xyz]$/)//示例5
对于MySQL:
选择不定位(@v,'xyz');--例1
选择@v不在('x','y','z');--例2
--对其他模式重复相同的模式
对于C:
if(!strstr(“xyz”,v))//示例1,未测试
还有更多的方法,我只是太懒了
发挥你的想象力,只写一个你更喜欢的 我想我应该为Bourne shell脚本提供一个答案,因为它的语法有些奇怪
在传统的/POSIXsh
中,字符串相等性测试是[
命令的一个特性(是的,这是一个独特的命令名!),它在引用等方面有一些麻烦的要求
#### WRONG
if [ "$v" != 'x' ] || [ "$v" != 'y'] || [ "$v" != 'z' ]; then
: some code which should happen when $v is not 'x' or 'y' or 'z'
fi
像Ksh、Bash、Zsh等现代shell也有[[
,这有点不那么麻烦
#### STILL WRONG
if [[ $v != 'x' || $v != 'y' || $v != 'z' ]]; then
: some code which should happen when $v is not 'x' or 'y' or 'z'
fi
我们应该强调在每个标记周围有空格的要求,这是许多初学者忽略的(即,如果[[$v
或$v!='y'
没有空格,在命令和运算符周围不能说),以及引用的明显可选性。不引用值通常不是语法错误,但如果不引用需要引用的值,将导致严重的不希望出现的语义问题。()
这里明显的修复方法是使用&&
而不是| |
,但是您还应该注意,[[
通常支持正则表达式,因此您可以说
if [[ ! $v =~ ^(x|y|z)$ ]]; then
: yeah
fi
别忘了