qual è la differenza nell'uso di & amp; & amp; e || nel do & # 8230; while loop?
-
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?
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'))