if statement - varias - ¿Por qué el control de no igualdad de una variable contra muchos valores siempre devuelve verdadero?
if then else visual basic (2)
Tengo una variable v en mi programa, y puede tomar cualquier valor del conjunto de valores
"a", "b", "c", ..., "z"
Y mi objetivo es ejecutar alguna declaración solo cuando v no es "x" , "y" , o "z" .
Yo he tratado,
para los lenguajes tipo C (donde los operadores de igualdad comparan los valores reales de las cadenas, por ejemplo, c # , javascript , php )
if (v != "x" || v != "y" || v != "z") { // the statements I want to be executed // if v is neither "x", nor "y", nor "z" }para los idiomas similares a Pascal (por ejemplo, plsql )
IF (v != ''x'' OR v != ''y'' OR v != ''z'') THEN -- the statements I want to be executed -- if v is neither "x", nor "y", nor "z" END IF;
Las instrucciones dentro de la condición if siempre se ejecutan . ¿Estoy haciendo algo mal?
Podrías usar algo como esto, para PHP:
if(strpos(''xyz'',$v[0])===false)//example 1
//strpos returns false when the letter isn''t in the string
//returns the position (0 based) of the substring
//we must use a strict comparison to see if it isn''t in the substring
if(!in_array($v[0],array(''x'',''y'',''z'')))//example 2
//example 3
$out=array(''x''=>1,''y''=>1,''z''=>1); //create an array
if(!$out[$v[0]]) //check if it''s not 1
if(!preg_match(''/^[xyz]$/'',$v))//example 4, using regex
if(str_replace(array(''x'',''y'',''z''),'''',$v[0]))//example 5
if(trim($v[0],''xyz''))//example 6
Para Javascript:
if(~''xyz''.search(v[0]))//example 1(.indexOf() works too)
if(!(v[0] in {x:0,y:0,z:0}))//example 2
if(~[''x'',''y'',''z''].indexOf(v[0]))//example 3, incompatible with older browsers.
if(!/^[xyz]$/.match(v))//example 4
if(v.replace(/^[xyz]$/))//example 5
Para MySQL:
Select not locate(@v,''xyz''); -- example 1
select @v not in (''x'',''y'',''z''); -- example 2
-- repetition of the same pattern for the others
Para C:
if(!strstr(''xyz'',v))//example 1, untested
Hay más formas, soy demasiado vago.
¡Usa tu imaginación y solo escribe la que más te guste!
Usa && / AND / and , no || / OR / or :
v != "x" && v != "y" && v != "z"
Si un bloque if se ejecuta siempre, la condición para el bloque if siempre se evalúa como true . La expresión lógica debe estar equivocada.
Consideremos v != "x" || v != "y" || v != "z" v != "x" || v != "y" || v != "z" v != "x" || v != "y" || v != "z" para cada valor de v .
Cuando
v = "x",v != "x"convierte en"x" != "x", lo que da es falso .
v != "y"convierte en"x" != "y", que da es verdadero .
v != "z"convierte en"x" != "y", lo que da es verdadero .La expresión se evalúa como
false || true || truefalse || true || truefalse || true || true, que es verdadCuando
v = "y", la expresión se vuelve"y" != "x" || "y" != "y" || "y" != "z"o
true || false || truetrue || false || truetrue || false || true, que es verdadCuando
v = "z", la expresión se vuelve"z" != "x" || "z" != "y" || "z" != "z"o
true || true || falsetrue || true || falsetrue || true || false, que es verdadPara cualquier otro valor para
v, la expresión se evalúa comotrue || true || truetrue || true || truetrue || true || true, que es verdad
Alternativamente, considere la tabla de verdad:
│ 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
Como puede ver, su expresión lógica siempre se evalúa como true .
Lo que quiere hacer es encontrar una expresión lógica que evalúe como true cuando
(v is not "x")and(v is not "y")and(v is not "z").
La construcción correcta es,
para lenguajes tipo C (p. ej., c # , javascript , php )
if (v != "x" && v != "y" && v != "z") { // the statements I want to be executed // if v is neither "x", nor "y", nor "z" }para lenguajes similares a Pascal plsql
IF (v != ''x'' AND v != ''y'' AND v != ''z'') THEN -- the statements I want to be executed -- if v is neither "x", nor "y", nor "z" END IF;
Por la Ley de Morgan , la expresión también puede reescribirse como (usando la sintaxis C)
!(v == "x" || v == "y" || v == "z")
sentido
not((v is "x")or(v is "y")or(v is "z")).
Esto hace que la lógica sea un poco más obvia.
Algunos idiomas tienen construcciones específicas para probar la pertenencia a conjuntos, o puede usar operaciones de matriz / lista.
sql :
v NOT IN (''x'', ''y'', ''z'')javascript :
["x", "y", "z"].indexOf(v) == -1python :
v not in {"x", "y", "z"}