¿Cuál es la diferencia en el uso de & amp; & amp; y || en el do ... while loop?

StackOverflow https://stackoverflow.com/questions/647413

  •  22-07-2019
  •  | 
  •  

Pregunta

#include<iostream>
using namespace std;

int main()
{

    char again;
    do
    {
        cout<<"you are in the while loop";
        cout<<"do you want to continue looping?";
        cin>>again;
    } while (again != 'n' || again != 'N');

    system("pause");
    return 0;
}

Sé que algo está mal con la condición de prueba en el 'tiempo'. Pero no puedo entenderlo.

cuando la entrada del usuario no es ni 'n' ni 'N', el bucle debe seguir imprimiendo el código '' usted está en el bucle while ''. Una vez que se presiona 'n' o 'N', el programa finalizará.

Sin embargo, para mi código, el programa seguirá repitiendo el código independientemente del carácter que ingrese. Pero cuando cambio el '||' a '& amp; & amp;', el programa puede ejecutarse como se desee. ¿Alguien puede decirme qué está pasando?

¿Fue útil?

Solución

Esta es una pregunta común de lógica booleana. || significa " o, " lo que significa "mientras un lado de esto sea verdadero, entonces la expresión es verdadera". Entonces, cuando pasa una 'N' mayúscula a c! = 'N' || c! = 'N' el programa dice " bueno, 'N' no es igual a 'n' , por lo tanto, un lado de la expresión es verdadero , por lo tanto, toda la expresión es verdadera y no hay necesidad de verificar el resto de la expresión. Incluso cuando presiona 'n' en minúsculas, el programa dice "bueno", 'n' es igual a 'n' , pero no es igual a 'N' , por lo tanto, un lado de la expresión es verdadero, por lo tanto, toda la expresión es verdadera. " Esto es lo que está sucediendo en tu ciclo while.

Por otro lado, & amp; & amp; significa " y " lo que significa "ambos lados de la expresión deben ser verdaderos" cuando pasa una 'N' mayúscula a c! = 'n' & amp; & amp; c! = 'N' el programa piensa que " 'N' no es igual a 'n' , pero es igual a 'N ', por lo tanto, solo un lado de la expresión es verdadero, por lo tanto, la expresión es falsa. "

Esto se vuelve confuso porque si estaba probando para ver si los caracteres ingresados ??eran iguales a valores particulares, usaría || (por ejemplo, " Quiero saber si 'a' o 'b' o 'c' se ingresó ").

Básicamente, cuando usaría || para una expresión particular, y desea lo opuesto a esa expresión, entonces debe cambiar a & amp; & amp; (p. ej. , No quiero ninguno de 'a' , 'b' o 'c' ; o dicho de otra manera, el valor no puede ser < code> 'a' y no puede ser 'b' , y no puede ser 'c' "). Del mismo modo, si usaría & amp; & amp; para una expresión particular, y desea lo contrario de esa expresión, entonces debe usar || . Esta es una de las leyes de De Morgan, que te recomendaría que leyeras para evitar tener que redescubrirlas por tu cuenta.

Otros consejos

Sí: || es "o" y & amp; & amp; es " y " ;.

Cada carácter es bien " no 'n' " o '' no 'N' '' porque no puede ser ambos 'n' y 'N' simultáneamente.

Otra forma (probablemente más fácil de leer) de escribir la condición sería:

!(again == 'n' || again == 'N')

que significa " lo contrario de (nuevamente es ya sea 'n' o 'N') " ;.

Es el álgebra booleana llamada " Las leyes de De Morgan ".

Not (P And Q) = (Not P) Or (Not Q)
Not (P Or Q) = (Not P) And (Not Q)

En su caso, desea que los usuarios no ingresen 'n' o 'N' , se puede traducir a esta lógica.

!(again == 'n' || again == 'N')

Al aplicar las leyes de De Morgan, será

(again != 'n' && again != 'N')

Para obtener más información, puede leer Lógica proposicional

Aunque el póster original es feliz ahora, no vi esto en las otras respuestas:

(true  && true ) == true
(true  && false) == false
(false && true ) == false
(false && false) == false

(true  || true ) == true
(true  || false) == true
(false || true ) == true
(false || false) == false

!true  == false
!false == true

¡Eso es todo!

Entiendo bien tu problema, y ??aquí está la explicación:

El ciclo do-while es un ciclo de condición de salida. Esto significa que el cuerpo del bucle siempre se ejecuta primero. Luego, se evalúa la condición de prueba. Si la condición de prueba es VERDADERA, el programa ejecuta nuevamente el cuerpo del bucle. Si la condición de prueba es FALSA, el bucle termina y la ejecución del programa continúa con la instrucción que sigue al while.

en su código, cuando presiona 'n' o 'N', su condición de prueba será siempre una verdadera y una falsa, entonces cuando usas || satisfará la condición de prueba (verdadero || falso = verdadero), por lo que el programa ejecutará nuevamente el cuerpo del bucle. pero cuando usas & amp; & amp; , esto proporcionará (verdadero & amp; & amp; false = false), la condición de prueba ya no está estadizada, por lo que el programa no volverá a ejecutar el cuerpo del bucle.

Espero que sea útil ... ¡disfruten de la programación! Ameraradi

& amp; & amp; es un AND lógico. || es un OR lógico.

(también, & amp; es un AND a nivel de bit, y | es un OR a nivel de bit)

es posible que desee probar mientras (! (again == 'n' || again == 'N'))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top