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 || true
false || true || true
false || true || true
, que es verdadCuando
v = "y"
, la expresión se vuelve"y" != "x" || "y" != "y" || "y" != "z"
o
true || false || true
true || false || true
true || false || true
, que es verdadCuando
v = "z"
, la expresión se vuelve"z" != "x" || "z" != "y" || "z" != "z"
o
true || true || false
true || true || false
true || true || false
, que es verdadPara cualquier otro valor para
v
, la expresión se evalúa comotrue || true || true
true || true || true
true || 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) == -1
python :
v not in {"x", "y", "z"}