behöver förklaring av while och true/false med !

Permalänk
Inaktiv

behöver förklaring av while och true/false med !

bool done = false; while (!done) { Console.Write("Enter a number: "); string number = Console.ReadLine(); if (number == "") { done = true; } else { int n = int.Parse(number); numbers.Add(n); } }

Tog bara med den aktuella koden i frågeställningen. Så det är mycket som saknas för att se ut som ett fullt funktionsdugligt program.

Som jag tolkar det så är det så här:

Done ÄR false. SÅ LÄNGE SOM done ÄR true. MATA IN sträng. OM variabel ÄR LIKA MED sträng. Done ÄR true

Så, det jag inte förstår är...
Varför kör while loopen? Boolean är ju satt till false och while loopen säger att den bara ska köra om boolean är true.
Alltså borde den inte köra alls?

Och sen när bool får true i if-satsen. Så blir ju while-loopens tillstånd "OM false" och avbryts.
Så varför kör den först och ända tills if-satsen blir aktuell och ändrar värdet på done?

Permalänk
Medlem
Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem

Du är nästan i hamn, det du behöver se över är vad ett "!" betyder (det betyder NOT). Så i ditt fall är frågan som ställs "OM variabel done INTE är sant, DÅ...".

Visa signatur

Vill du att jag besvarar något så kom ihåg att citera mitt inlägg! :)

Permalänk
Medlem

Du läser while-raden fel. Den ska läsas som "while not Done", eller "så länge som Done är false".

Skickades från m.sweclockers.com

Permalänk
Medlem

Tag bort onödig if.
done = (number == "");
Boolska variabler kan användas för att göra program mer lättlästa.

Skickades från m.sweclockers.com

Permalänk
Inaktiv
Skrivet av Subtractive:

Du är nästan i hamn, det du behöver se över är vad ett "!" betyder (det betyder NOT). Så i ditt fall är frågan som ställs "OM variabel done INTE är sant, DÅ...".

Skrivet av instream:

Du läser while-raden fel. Den ska läsas som "while not Done", eller "så länge som Done är false".

Skickades från m.sweclockers.com

Jag vet att ! är NOT. Det är ju precis det jag skrev att jag tycker det är konstigt att den körs trots att den säger att det ska vara NOT/tvärtom eller hur man nu vill se på det.

"while not Done" är ju lika med true?

Done sätts ju till false med raden:

bool done = false;

Så, om "while not done", då är ju det i så fall "while not false", som då är lika med true, eller "while true"

Permalänk
Medlem

@anon170706: While-satsen fungerar precis som en if-sats, frågan du ställer är ju "Så länge som done är false, kör mig". Eftersom att done == false, är frågan sann, varav loopen körs.

Edit
Tror jag förstår vad som förvirrar nu, du kikar på värdet i sig i 'done', framför själva jämförelsen. Det spelar egentligen ingen roll vad variabeln 'done' innehåller, utan det är i frågesatsen självt som det avgörs om loopen skall köras eller inte (som förklarat ovan) och är i detta exempel även då värdet i 'done' först spelar roll på nivån "är det sant eller falskt".

Visa signatur

Vill du att jag besvarar något så kom ihåg att citera mitt inlägg! :)

Permalänk
Inaktiv
Skrivet av Subtractive:

@tqila: While-satsen fungerar precis som en if-sats, frågan du ställer är ju "Så länge som done är false, kör mig". Eftersom att done == false, är frågan sann, varav loopen körs.

Edit
Tror jag förstår vad som förvirrar nu, du kikar på värdet i sig i 'done', framför själva jämförelsen. Det spelar egentligen ingen roll vad variabeln 'done' innehåller, utan det är i frågesatsen självt som det avgörs om loopen skall köras eller inte (som förklarat ovan) och är i detta exempel även då värdet i 'done' först spelar roll på nivån "är det sant eller falskt".

om frågan är "så länge done är false". Varför då använda sig utav ett "!"?
Done är ju satt till false.

och således borde ju frågan bli "så länge done är true" (eftersom ! används)

edit: om inte värdet i done spelar någon roll. Varför skapa en bool med värdet false? Eller snarare, varför överhuvudtaget lägga med done i while satsen? Och särkilt med ett "!".

Låter onekligen väldigt omständigt. Då kan man ju lika gärna skriva "while(done)" och bara ändra värdet på done.
eller använda while(true) eller while(false)

Permalänk
Medlem
Skrivet av anon170706:

om frågan är "så länge done är false". Varför då använda sig utav ett "!"?
Done är ju satt till false.

och således borde ju frågan bli "så länge done är true" (eftersom ! används)

Därför att om done är satt till false, ställer du egentligen inte längre en fråga så som du gör med NOT-operatorn. Skillnaden är att med "!" ställer du en fråga "OM done är false, kör loopen", utan den så kollar du istället på värdet direkt i variabeln och ställer frågan "Ska jag köra loopen? Varav du genom variabeln får värdet/svaret false".

bool done = false; if(done) <--- Blir false (hämtar värdet direkt i variabeln som är false) if(!done) <--- Blir true (kontrollerar om värdet är false, OM värdet är false, så är frågan/resultatet true, done ÄR satt till false)

Visa signatur

Vill du att jag besvarar något så kom ihåg att citera mitt inlägg! :)

Permalänk
Inaktiv
Skrivet av Subtractive:

Därför att om done är satt till false, ställer du egentligen inte längre en fråga så som du gör med NOT-operatorn. Skillnaden är att med "!" ställer du en fråga "OM done är false, kör loopen", utan den så kollar du istället på värdet direkt i variabeln och ställer frågan "Ska jag köra loopen? Varav du genom variabeln får värdet/svaret false".

bool done = false; if(done) <--- Blir false (hämtar värdet direkt i variabeln som är false) if(!done) <--- Blir true (kontrollerar om värdet är false, OM värdet är false, så är frågan/resultatet true, done ÄR satt till false)

i ditt sista förslag där (som är det som används i min kod). Vad är det som gör att den kontrollerar om den är false?
!done = tvärtom vad done värdet är? borde då vara lika med true? Eller vad är det som gör att den kollar just false, och inte true?
kolla om NOT done borde ju vara true? och om true så är resultatet false, eftersom done är false.

Permalänk
Medlem

while utvärderar om ett uttryck är sant eller falskt, om det är sant så kör den loopen, om det är falskt så kör den inte loopen.

Du har done = false, så done är false. !done utvärderar till true när done är false, och false när done är true.

while(!done) betyder då alltså för ett falskt värde på done: while(!false) vilket blir while(true) och eftersom att den då utvärderade till true så fortsätter den loopen. Om done då blir sant så utvärderar den while(!true) vilket blir while(false) vilket betyder att den inte fortsätter loopen.

Med andra ord så utvärderar while inte variabeln utan uttrycket. !done om done är falsk betyder true, while kollar alltså inte om done är true utan om uttrycket är true.

Permalänk
Medlem
Skrivet av anon170706:

i ditt sista förslag där (som är det som används i min kod). Vad är det som gör att den kontrollerar om den är false?
!done = tvärtom vad done värdet är? borde då vara lika med true? Eller vad är det som gör att den kollar just false, och inte true?
kolla om NOT done borde ju vara true? och om true så är resultatet false, eftersom done är false.

En if-sats eller while-loop fungerar ju så att den körs, eller fångas upp i ett annat statement beroende på om jämförelsen i den är sant eller falskt.

Om vi har en bool (variabel som bara kan vara true eller false), som innehåller värdet 'false', så finns "svaret på frågan" direkt i variabeln, utan att man behöver ställa en fråga.

Om vi skriver om exemplet till detta, så kanske det blir tydligare vad som händer.

var done = false; while (done != false) { } while (!done) { } while (!false) { }

Alla exempel här gör exakt samma sak, men är olika formaterade.
Exempel 1, där har du en tydligare jämförelse "OM värdet i variabeln 'done' INTE är false, kör då denna loop".

Exempel 2, samma fråga, men förkortad, detta kan vi göra då variabeln done, innehåller ett bool-värde och endera är true eller false, inget annat. Frågan blir "OM värdet i variabeln 'done' INTE är false, kör då denna loop"

Exempel 3, samma fråga igen, men här skippar vi variabel helt och frågar "OM inte false, kör då denna loop", vilket är samma sak som att skriva while(true) { }

Kontrollen är alltså det som sker mellan () efter ordet while, precis som i en if-sats. Där du får ett positivt, eller negativt svar och det är svaret som är det avgörande, inte vad variabeln i sig från början innehåller.

Det är pga detta du sedan väl inne i loopen kan tilldela värdet 'done = true;', vilket sedan gör att när loopen gått ett varv, automatiskt bryts, då while (!done) { } inte längre är sant.

Visa signatur

Vill du att jag besvarar något så kom ihåg att citera mitt inlägg! :)

Permalänk
Inaktiv
Skrivet av Subtractive:

Exempel 2, samma fråga, men förkortad, detta kan vi göra då variabeln done, innehåller ett bool-värde och endera är true eller false, inget annat. Frågan blir "OM värdet i variabeln 'done' INTE är false, kör då denna loop"

Här skriver du ju precis det jag sagt. Och anledningen till varför loopen INTE borde köra. Done är ju false. Alltså ska den inte köra loopen. Men ändå körs den.

Skickades från m.sweclockers.com

Permalänk
Medlem

En while-loop som t.ex.:

bool done = false; while (!done) { doSomething(); }

kan skrivas om genom att använda goto:

bool done = false; Start: if (!done == false) { // Är villkoret falskt? goto End; // Hoppa ur loopen. } doSomething(); // Kör koden inne i loopen. goto Start; // Hoppa tillbaks till början av loopen. End:

Notera att jag använder goto här enbart för att demonstrera flödet i en while-loop, att faktiskt använda goto i riktig kod är något som brukar ogillas starkt.

Permalänk
Medlem
Skrivet av anon170706:

Här skriver du ju precis det jag sagt. Och anledningen till varför loopen INTE borde köra. Done är ju false. Alltså ska den inte köra loopen. Men ändå körs den.

Skickades från m.sweclockers.com

While loopen kör så länge villkoret är sant.
Villkoret är att done ÄR false (done är en variabel, blanda inte ihop den med ordets betydelse utan vad variabeln innehåller, i nuläget false)
När done sätts om till true så bryts loopen då villkoret inte längre är sant.

Rent krasst säger du att din loop ska köra så länge done ÄR false.
D.v.s. så länge done är false så är villkoret sant.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Skrivet av anon170706:

Här skriver du ju precis det jag sagt. Och anledningen till varför loopen INTE borde köra. Done är ju false. Alltså ska den inte köra loopen. Men ändå körs den.

Skickades från m.sweclockers.com

Done är false men !Done är true. Loopen While(X) körs när X är true.

Visa signatur

Ryzen 3900X || ASUS ROG Strix X570-E Gaming || ASUS GeForce RTX 2080 8GB DUAL EVO || Corsair Vengeance RGB PRO DDR4-3200 || ACER - XB280HK 28

Permalänk
Medlem

Blir tydligare om du expanderar villkoret

//samma som while(!done) while (done == false) { ... }

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | Dell S2721DGFA | Asus MG279Q |

Permalänk
Inaktiv
Skrivet av noMad17:

While loopen kör så länge villkoret är sant.
Villkoret är att done ÄR false (done är en variabel, blanda inte ihop den med ordets betydelse utan vad variabeln innehåller, i nuläget false)
När done sätts om till true så bryts loopen då villkoret inte längre är sant.

Rent krasst säger du att din loop ska köra så länge done ÄR false.
D.v.s. så länge done är false så är villkoret sant.

Skrivet av hooloovoo:

Done är false men !Done är true. Loopen While(X) körs när X är true.

Nu fattar jag verkligen ingenting.
Nu säger ni väl emot varandra?

Jag fattar nog inte hur det här är logiskt..

variabeln done ÄR false.
while kollar OM done INTE ÄR false. men done ÄR false. så !done ÄR false.
då körs loopen tills !done blir true.
sen sätts done sätts till true i if-satsen.
då kollar while istället OM done INTE ÄR true, men done ÄR true och det är false, eftersom done nu är true, så då stannar loopen.

Är det korrekt uppfattat?

Det jag tror jag behöver förstå är om det som står innanför () i while kollar om värdet INTE är. Och då sätter ett värde i while som ska köra loopen tills det ändras, beroende på vad svaret blir. Eller om while säger att det som står innanför () med ett "!", ska vara motsatsen av variabeln som står efter "!".

Permalänk
Medlem
Skrivet av anon170706:

Nu fattar jag verkligen ingenting.
Nu säger ni väl emot varandra?

Jag fattar nog inte hur det här är logiskt..

variabeln done ÄR false.
while kollar OM done INTE ÄR false. men done ÄR false. så !done ÄR false.
då körs loopen tills !done blir true.
sen sätts done sätts till true i if-satsen.
då kollar while istället OM done INTE ÄR true, men done ÄR true och det är false, eftersom done nu är true, så då stannar loopen.

Är det korrekt uppfattat?

Det jag tror jag behöver förstå är om det som står innanför () i while kollar om värdet INTE är. Och då sätter ett värde i while som ska köra loopen tills det ändras, beroende på vad svaret blir. Eller om while säger att det som står innanför () med ett "!", ska vara motsatsen av variabeln som står efter "!".

Lär dig boolsk algebra!
I while-slingan kan du skriva tydligt.

boolean time-to-leave;
.
when (time-to-leave)leave;
.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av anon170706:

variabeln done ÄR false.
while kollar OM done INTE ÄR false. men done ÄR false. så !done ÄR false.
då körs loopen tills !done blir true.

Nej. while kollar inte över huvud taget på done, den bryr sig inte om done, done är en variabel, while bryr sig om ett uttryck. variabeln done är av typen bool och kan då användas som ett uttryck, det är alltså då ett annat sätt att säga true eller false. while kollar ENBART om uttrycket är sant eller falskt, om det är sant så ska loopen köras, om det är falskt så ska den inte köras.

!done betyder inte om done är falskt, !done betyder i princip invers av vad done annars är. Om done är falskt så är !done true, om done är true så är !done falskt.

Om done är falskt så betyder det att !done utvärderar till true, för invers av falskt är sant, inte falskt är sant, på samma sätt som att inte sant är falskt. Kom ihåg nu att while enbart utvärderar ett uttryck och inte en variabel, om variabeln done då är falskt så betyder det att !done utvärderar till true, och eftersom att uttrycket utvärderar till true så betyder det att while loopen ska köras.

Om 'done' är false så betyder det att '!done' utvärderar till true eftersom att not false är true.

Permalänk
Inaktiv
Skrivet av SanyaIV:

Nej. while kollar inte över huvud taget på done, den bryr sig inte om done, done är en variabel, while bryr sig om ett uttryck.

Varför då ha med variablen done i "while()"? Om den inte bryr sig om done..

Skrivet av SanyaIV:

variabeln done är av typen bool och kan då användas som ett uttryck, det är alltså då ett annat sätt att säga true eller false. while kollar ENBART om uttrycket är sant eller falskt, om det är sant så ska loopen köras, om det är falskt så ska den inte köras.

hur vet den om variabeln done är true eller false, om den inte kollar på värdet? dvs vad är det i uttrycket som bestämmer om den i while() är true eller false om den fullständigt skiter i värdet?

Skrivet av SanyaIV:

!done betyder inte om done är falskt, !done betyder i princip invers av vad done annars är. Om done är falskt så är !done true, om done är true så är !done falskt. Om done är falskt så betyder det att !done utvärderar till true, för invers av falskt är sant, inte falskt är sant, på samma sätt som att inte sant är falskt. Kom ihåg nu att while enbart utvärderar ett uttryck och inte en variabel, om variabeln done då är falskt så betyder det att !done utvärderar till true, och eftersom att uttrycket utvärderar till true så betyder det att while loopen ska köras.

Om 'done' är false så betyder det att '!done' utvärderar till true eftersom att not false är true.

Ok, så !done betyder while(true). Och ska köras tills det blir false. Och när done sätts till true i if-satsen så blir !done då istället false. Men då har den ju enligt din förklaring bara ändrat att while ska köras tills något blir true istället. dvs från while(true) till while(false), om det bara är det som ändras.

Permalänk
Medlem

så här: din while loop utvärderar villkoret varje varv. Dvs det som du skriver: while (_HÄR_) måste vara lika med antingen "true" eller "false" när man räknar ut det.

bool done = false; //Vi räknar ut villkoret: (false == false) -> true while (done == false) -> while (true) //Vi räknar ut villkoret: (false) -> false, while (done) -> while (false) //utropstecknet inverterar boolen. //Vi räknar ut villkoret: !(false) -> (true) -> true while (!done) -> while(true)

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | Dell S2721DGFA | Asus MG279Q |

Permalänk
Medlem
Skrivet av anon170706:

Varför då ha med variablen done i "while()"? Om den inte bryr sig om done..

För att uttrycket bryr sig om variabeln, while bryr sig om uttrycket.

Skrivet av anon170706:

hur vet den om variabeln done är true eller false, om den inte kollar på värdet? dvs vad är det i uttrycket som bestämmer om den i while() är true eller false om den fullständigt skiter i värdet?

För att utvärderingen av uttrycket ändras beroende på variabeln done. while bryr sig om uttrycket. while bryr sig bara om uttrycket utvärderar till true eller false. Om den är true ska den köra loopen, om den är false ska den inte köra loopen.

done är en variabel, men kan användas som ett uttryck. Om variabeln 'done' är satt till "false" så utvärderar uttrycket '!done' till true, eftersom att !done kan skrivas om till !false (för att done i detta skede är false) och !false är not false, alltså true. Så uttrycket !done är då i detta skede samma sak som !false vilket är true så då utvärderas uttrycket till true och det är det som användas av while. while ser då att uttrycket utvärderas till true och kör då loopen.
Om variabeln done senare sätts till true I loopen så betyder det att uttrycket !done kan skrivas om till !true vilket då är not true, vilket är samma sak som false. Uttrycket utvärderas då alltså till false, eftersom att while enbart kollar på vad uttrycket utvärderar till så kan det nu skrivas om till while(false) vilket betyder att den inte kommer köras, för den kör enbart när uttrycket är sant, och det är falskt här.

Skrivet av anon170706:

Ok, så !done betyder while(true).

!done betyder inte i sig självt att while(true), utan om done är falskt och du ger !done så kan while(!done) skrivas om till while(true) eftersom att om done är falskt så kan !done skrivas om som true.

Skrivet av anon170706:

Och ska köras tills det blir false. Och när done sätts till true i if-satsen så blir !done då istället false.

När variabeln done sätts till true så utvärderas !done till false, eftersom att not true är false !done kan då skrivas om som false vilket betyder att while-satsen kan skrivas om som while(false) ja.

Skrivet av anon170706:

Men då har den ju enligt din förklaring bara ändrat att while ska köras tills något blir true istället. dvs från while(true) till while(false), om det bara är det som ändras.

Nej. Vad utvärderar ett simpelt "false" till? Svaret är false. Så utvärderingen av uttrycket "false" är false, while får då sitt svar på uttrycket "false" och svaret är "false", eftersom att svaret är false så ska loopen avbrytas.

Om svaret är true = kör loop
Om svaret är false = kör inte loop

while(true) = evig loop för true är alltid true (förutsatt att du inte använder break inuti loopen)
while(false) = kör aldrig för false är alltid false
while(!true) = kör aldrig för not true är false och false är alltid false
while(!false) = evig loop för not false är true och true är alltid true (förutsatt att du inte använder break inuti loopen)

Så, låt oss då säga att vi börjar med att done = true. while(!done) är då samma sak som while(false) eftersom att not true är false. Eftersom att uttrycket utvärderade till false så säger det till while loopen att den inte ska köras.

while(false) säger alltså INTE att den ska köra medan något imaginärt är samma sak som false, while(false) säger att den ska köra medan utvärderingen av uttrycket "false" är true, men false är aldrig true så den kör aldrig.

Permalänk
Inaktiv

@SanyaIV: ah ok, jag har nog missuppfattat och trott att man kunde välja true eller false för att köra en while loop.
och sätta t.ex något som blir true och då stannar loopen.
Men då är alltså alltid true = kör loopen och false = NOPE!

då hänger jag med på varför den stannar när done = true i if-satsen.
Och jag förstår varför den startar när det är while(!done) eftersom done = false.

tack för hjälpen alla!

Inte lätt när man är dum (erhmm.. nybörjare).

Permalänk
Medlem
Skrivet av anon170706:

@SanyaIV: ah ok, jag har nog missuppfattat och trott att man kunde välja true eller false för att köra en while loop.
och sätta t.ex något som blir true och då stannar loopen.
Men då är alltså alltid true = kör loopen och false = NOPE!

då hänger jag med på varför den stannar när done = true i if-satsen.
Och jag förstår varför den startar när det är while(!done) eftersom done = false.

tack för hjälpen alla!

Inte lätt när man är dum (erhmm.. nybörjare).

Kan ta lite tid att få kläm på det där. Speciellt när det blir extremt mycket upprepningar med true, false, not true, not false etc. Bara fortsätta köra så kommer det bli mer klart framöver!

Visa signatur

"Happiness is only real when shared"

Permalänk
Medlem
Skrivet av anon170706:

@SanyaIV: ah ok, jag har nog missuppfattat och trott att man kunde välja true eller false för att köra en while loop.
och sätta t.ex något som blir true och då stannar loopen.
Men då är alltså alltid true = kör loopen och false = NOPE!

då hänger jag med på varför den stannar när done = true i if-satsen.
Och jag förstår varför den startar när det är while(!done) eftersom done = false.

tack för hjälpen alla!

Inte lätt när man är dum (erhmm.. nybörjare).

while(X) {...} betyder "Kör medan X är sant" där X är något uttryck.
while(!done) {....} betyder således "Kör medan !done är sant"
!done är sant när done inte är sant, dvs när done är falskt.

Så med andra ord så har vi att while(!done) {....} betyder "Kör medan done inte är sant" vilket är samma som "Kör medan done är falskt"