qual è la differenza nell'uso di & amp; & amp; e || nel do & # 8230; while loop?

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

  •  22-07-2019
  •  | 
  •  

Domanda

#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;
}

So che qualcosa non va nelle condizioni del test nel 'while'. Ma non riesco a capirlo.

quando l'input dell'utente non è né 'n' né 'N', il ciclo dovrebbe continuare a stampare il codice "sei nel ciclo while". Una volta premuto 'n' o 'N', il programma verrà terminato.

Tuttavia, per il mio codice, il programma continuerà a riprodurre il codice in loop indipendentemente dal carattere che inserisco. Ma quando cambio il '||' su "& amp; & amp;", il programma può essere eseguito come desiderato. Qualcuno può dirmi cosa sta succedendo?

È stato utile?

Soluzione

Questa è una domanda logica booleana comune. || significa " oppure, " che significa "fintanto che un lato di questo è vero, allora l'espressione è vera." Quindi quando passi un 'N' maiuscolo a c! = 'N' || c! = 'N' il programma dice " bene, 'N' non è uguale a 'n' , quindi un lato dell'espressione è vero , pertanto l'intera espressione è vera e non è necessario controllare il resto dell'espressione. " Anche quando premi 'n' minuscolo, il programma dice " bene, 'n' è uguale a 'n' , ma non lo è uguale a 'N' , quindi un lato dell'espressione è vero, quindi l'intera espressione è vera. " Questo è ciò che sta accadendo nel tuo ciclo while.

D'altra parte, & amp; & amp; significa " e " che significa "entrambi i lati dell'espressione devono essere veri"; quando passi un 'N' maiuscolo a c! = 'n' & amp; & amp; c! = 'N' il programma pensa che " 'N' non è uguale a 'n' , ma è uguale a 'N ', quindi solo un lato dell'espressione è vero, pertanto l'espressione è falsa. "

Questo diventa confuso perché se stavi testando per vedere se i caratteri inseriti fossero uguali a valori particolari useresti || (ad es. " Voglio sapere se 'a' o 'b' o 'c' è stato inserito ").

Fondamentalmente, quando useresti || per una particolare espressione e desideri il contrario di quell'espressione, devi cambiare in & amp; & amp; (es. , Non desidero nessuno di 'a' , 'b' o 'c' ; o per dirla in altro modo, il valore non può essere < codice> 'a' e non può essere 'b' , e non può essere 'c' "). Allo stesso modo, se dovessi usare & amp; & amp; per una particolare espressione e desideri il contrario di quella espressione, allora devi usare || . Questa è una delle leggi di De Morgan, che consiglierei di leggere in modo da poter evitare di riscoprirle da sole.

Altri suggerimenti

Sì: || è " o " e & amp; & amp; è " e " ;.

Ogni carattere è o " non 'n' " o "non" N "" perché non può essere entrambi 'n' e 'N' contemporaneamente.

Un altro modo (probabilmente più semplice da leggere) di scrivere la condizione sarebbe:

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

che significa " l'opposto di (di nuovo è o 'n' o 'N') " ;.

È l'algebra booleana chiamata " Leggi di De Morgan ".

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

Nel tuo caso, desideri che gli utenti non inseriscano 'n' o 'N' , possono essere tradotti in questa logica.

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

Quando si applicano le leggi di De Morgan, sarà

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

Per ulteriori informazioni, potresti voler leggere Logica proposizionale

Anche se il poster originale è felice ora, non ho visto questo nelle altre risposte:

(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

Questo è tutto!

Comprendo bene il tuo problema, ed ecco la spiegazione:

Il loop do-while è un loop delle condizioni di uscita. Ciò significa che il corpo del loop viene sempre eseguito per primo. Quindi, viene valutata la condizione del test. Se la condizione del test è TRUE, il programma esegue nuovamente il corpo del loop. Se la condizione di test è FALSE, il ciclo termina e l'esecuzione del programma continua con l'istruzione che segue.

nel tuo codice, quando premi "n" o "N", la tua condizione di test sarà sempre una vera e una falsa, quindi quando usi || soddisferai le condizioni del test (true || false = true), quindi il programma eseguirà di nuovo il corpo del loop. ma quando usi & amp; & amp; , questo darà (true & amp; & amp; false = false), la condizione di test non è più statisificata, quindi il programma non eseguirà nuovamente il corpo del loop.

Spero sia utile ..... buona programmazione! Ameraradi

& amp; & amp; è un AND logico. || è un OR logico.

(inoltre, & amp; è un AND bit per bit, e | è un OR bit per bit.)

ti consigliamo di provare while (! (again == 'n' || again == 'N'))

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top