17 svar
711 visningar
barcode är nöjd med hjälpen
barcode 162 – Avstängd
Postad: 29 jul 2017 20:52

!

Hej 

Jag stötte på tecknet "!" idag. Men jag förstod inte riktigt vad som menas med det. Någon som skulle kunna ta lite tid och förklara lite snabbt?

Stokastisk 3597 – Fd. Medlem
Postad: 29 jul 2017 20:59 Redigerad: 29 jul 2017 21:04

Kan du ge ett exempel på där "!" dyker upp? Det enda jag kan tänka på är operatorn "!=" vilket betyder inte lika med, men annars kommer jag inte på var "!" skulle dyka upp.

Edit: Insåg vad det var, uppenbarligen är jag lite trög. Det betyder negering, man använder det på booleans. 

Det gäller att !true = false och att !false = true.

Yngve 37909 – Livehjälpare
Postad: 29 jul 2017 21:04 Redigerad: 29 jul 2017 21:11

! (logical not)

Called Logical NOT Operator. Use to reverses the logical state of its operand. If a condition is true then Logical NOT operator will make false.

Exempel:

Om A är True så är !(A) False.

barcode 162 – Avstängd
Postad: 29 jul 2017 21:06 Redigerad: 29 jul 2017 21:09
Stokastisk skrev :

Kan du ge ett exempel på där "!" dyker upp? Det enda jag kan tänka på är operatorn "!=" vilket betyder inte lika med, men annars kommer jag inte på var "!" skulle dyka upp.

Edit: Insåg vad det var, uppenbarligen är jag lite trög. Det betyder negering, man använder det på booleans. 

Det gäller att !true = false och att !false = true.

Så man kan säga att den ändrar från true till false eller tvärtom. Men varför skulle man inte bara skriva true eller false direkt?

Yngve 37909 – Livehjälpare
Postad: 29 jul 2017 21:10 Redigerad: 29 jul 2017 21:14

Säg att du har en logisk variabel doorIsOpen, som kan ha värdet True eller False.

I din kod vill du inte låta huvudpersonen gå ut genom dörren om den är stängd:

If !(doorIsOpen) {

  DontWalk();

}

Stokastisk 3597 – Fd. Medlem
Postad: 29 jul 2017 21:11
barcode skrev :
Stokastisk skrev :

Kan du ge ett exempel på där "!" dyker upp? Det enda jag kan tänka på är operatorn "!=" vilket betyder inte lika med, men annars kommer jag inte på var "!" skulle dyka upp.

Edit: Insåg vad det var, uppenbarligen är jag lite trög. Det betyder negering, man använder det på booleans. 

Det gäller att !true = false och att !false = true.

Så man kan säga att den ändrar från true till fasle eller tvärtom. Men varför skulle man inte bara skriva true eller false direkt?

Det fungerar ju på alla uttryck som är av typen boolean. Så säg att vi har

boolean ligthsOn = true;

Vi vill ha ett sätt som ändrar lightsOn till false om lightsOn är true, och vise versa. Detta skulle vi kunna skriva

lightsOn = !lightsOn

Detta är ju bara ett exempel och det finns garanterat fler bra situationer där man kan använda det.

barcode 162 – Avstängd
Postad: 29 jul 2017 21:15

Okej tack för båda era exempel. Men som Stokatisk skriver lightsOn=!lightsOn kan man inte skriva då också lightsOn=false. Men att det är snyggare att skriva på det andra sättet? eller misstar jag mig?

Yngve 37909 – Livehjälpare
Postad: 29 jul 2017 21:18 Redigerad: 29 jul 2017 21:19
barcode skrev :

Okej tack för båda era exempel. Men som Stokatisk skriver lightsOn=!lightsOn kan man inte skriva då också lightsOn=false. Men att det är snyggare att skriva på det andra sättet? eller misstar jag mig?

Det är inte säkert att du vet om lightsOn är True eller False.

Säg att koden är knuten till en tryckknapp. När du trycker på knappen så ska lampan tändas om den var släckt och släckas om den var tänd.

Stokastisk 3597 – Fd. Medlem
Postad: 29 jul 2017 21:18 Redigerad: 29 jul 2017 21:21
barcode skrev :

Okej tack för båda era exempel. Men som Stokatisk skriver lightsOn=!lightsOn kan man inte skriva då också lightsOn=false. Men att det är snyggare att skriva på det andra sättet? eller misstar jag mig?

Jag var kanske lite otydlig i mitt exempel. Men tanken är att där kodraden ligthsOn = !lightsOn är, så kommer man inte vet vad tillståndet är på ligthsOn när man skriver koden. Säg exempelvis att det är en knapp som tänder och släcker en lampa, så den där kodraden exekveras när man trycker på knappen. Vi kan ju då inte bara skriva lightsOn = false eftersom det bara skulle stänga av lampan, men aldrig sätta igång den igen.

barcode 162 – Avstängd
Postad: 29 jul 2017 21:22

Aha okej då börjar jag förstå. För om vi säger att lampan är på och vi kör lightsOn = !lightsOn så skulle den stängas av. Men om den är av så blir den på, och om jag bara skriver lightsOn=false. Kommer den att alltid var avstängd.

Stokastisk 3597 – Fd. Medlem
Postad: 29 jul 2017 21:32

Japp det stämmer.

Men jag tror att vanligaste stället du kommer stöta på "!" är i situationer som Yngve visade. Men det går att skriva om

if (!doorIsOpen) { .. }

till

if (doorIsOpen == false) {...}

Det senare är däremot mindre elegant och det är att föredra att använda "!" operatorn.

barcode 162 – Avstängd
Postad: 29 jul 2017 21:33

Okej tack så mycket hjälpen killar.

PeterÅ 842
Postad: 2 aug 2017 18:13 Redigerad: 2 aug 2017 18:17
Stokastisk skrev :

Japp det stämmer.

Men jag tror att vanligaste stället du kommer stöta på "!" är i situationer som Yngve visade. Men det går att skriva om

if (!doorIsOpen) { .. }

till

if (doorIsOpen == false) {...}

Det senare är däremot mindre elegant och det är att föredra att använda "!" operatorn.

Håller absolut inte med! if (doorIsOpen == false) {...} är mycket tydligare än if (!doorIsOpen) { .. }.
Det är lätt att missa utropstecknet och därmed missförstå instruktionen. 
Parentes:
Anledningen att ! finns är troligen programmerare som vill korta ner instruktionerna och samtidigt visa sig på styva linan. (Om man inte har någon styv lina att visa upp sig på kan man ta en bit kartong och limma fast en lina på. Sedan kan man visa upp sig på den) ...

Slut Parentes

Stokastisk 3597 – Fd. Medlem
Postad: 2 aug 2017 19:26

Okej, jag förstår din poäng men jag håller nog ändå inte med.

Men angående att det blir färre instruktioner så lär väl inte det vara sant, testade kompilera båda versionerna och det ger exakt samma bytekod.

PeterÅ 842
Postad: 2 aug 2017 19:45

Ja, det är väl självklart. ! är bara en förkortning som gör koden mer svårläst för icke-nördar!

Stokastisk 3597 – Fd. Medlem
Postad: 2 aug 2017 20:18

Okej, men det låter som du påstod att det skulle ge färre instruktioner?

Jag skulle aldrig i hela mitt liv släppa in någon som inte vet vad ! operatorn betyder till att göra någonting med koden, det är en sak som är säker iaf. Om man inte kan språket i fråga har man absolut inget där och göra.

Yngve 37909 – Livehjälpare
Postad: 2 aug 2017 21:11
PeterÅ skrev :
Parentes:
Anledningen att ! finns är troligen programmerare som vill korta ner instruktionerna och samtidigt visa sig på styva linan. 
Slut Parentes

Men i vissa fall är nog ändå operatorn "!" bra att ha.

Jag anser mig inte vara på styva linan när jag föredrar

lightIsOn = ! lightIsOn;

framför

If lightIsOn {

   lightIsOn = False;

} else {

   lightIsOn = True;

}

PeterÅ 842
Postad: 7 aug 2017 18:46

Förtydligande: Min invändning gällde inte tilldelning utan if-satser

Svara Avbryt
Close