Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么一个变量对多个值的不相等检查总是返回true?_C#_Javascript_Php_Plsql_If Statement_Language Agnostic_Control Flow_Multiple Languages_Sql_Python_Java_Java 9 - Fatal编程技术网

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脚本提供一个答案,因为它的语法有些奇怪

在传统的/POSIX
sh
中,字符串相等性测试是
[
命令的一个特性(是的,这是一个独特的命令名!),它在引用等方面有一些麻烦的要求

#### 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
别忘了