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.