22/08/2016
I programmeringsverdenen er operatorer de specielle symboler, der udfører bestemte operationer på værdier eller variabler, kendt som operander. Forestil dig dem som verberne i et sprog; de fortæller computeren, hvad den skal gøre. Dart, et moderne og alsidigt programmeringssprog, er udstyret med et rigt sæt af indbyggede operatorer, der kan bruges til alt fra simpel matematik til komplekse logiske sammenligninger og bit-manipulation. At forstå disse operatorer er fundamentalt for at kunne skrive effektiv og læselig kode. Uden dem ville vi ikke kunne udføre selv de mest basale beregninger eller træffe beslutninger i vores programmer. Denne artikel vil fungere som din komplette guide til at forstå og mestre de forskellige typer af operatorer, som Dart tilbyder, deres funktioner, og hvordan man bruger dem korrekt gennem praktiske eksempler.

Hvad er Operatorer og Operander?
En operator er et symbol, der instruerer compileren til at udføre en specifik matematisk, relationel eller logisk operation og producere et endeligt resultat. For eksempel er plussymbolet (+) en operator, der bruges til addition. De data, som operatorerne arbejder på, kaldes operander. I udtrykket 5 + 3 er 5 og 3 operander, mens + er operatoren. Et udtryk er en kombination af operander og operatorer, der evalueres til en enkelt værdi. Rækkefølgen, som operationerne udføres i, styres af operatorpræcedens og associativitet, hvilket sikrer forudsigelige og konsistente resultater.
Typer af Operatorer i Dart
Dart klassificerer sine operatorer i flere kategorier baseret på den type operation, de udfører. Lad os udforske hver af disse kategorier i detaljer.
1. Aritmetiske Operatorer
Disse er de mest almindelige operatorer og bruges til at udføre matematiske beregninger. De fungerer på numeriske operander og returnerer en numerisk værdi.
| Symbol | Navn | Beskrivelse |
|---|---|---|
| + | Addition | Lægger to operander sammen. |
| - | Subtraktion | Trækker den anden operand fra den første. |
| -expr | Unær Minus | Ændrer fortegnet på et udtryk. |
| * | Multiplikation | Ganger to operander. |
| / | Division | Dividerer den første operand med den anden, returnerer et double. |
| ~/ | Heltalsdivision | Dividerer to operander og returnerer kun heltalsdelen (kvotienten). |
| % | Modulus | Returnerer resten af en heltalsdivision. |
Her er et eksempel, der viser, hvordan de bruges:
// Dansk eksempel på aritmetiske operatorer void main() { int a = 10; int b = 3; // Addition var sum = a + b; print("Sum (a + b) = $sum"); // Output: 13 // Subtraktion var forskel = a - b; print("Forskel (a - b) = $forskel"); // Output: 7 // Unær Minus var negeret = -forskel; print("Negation -(a - b) = $negeret"); // Output: -7 // Multiplikation var produkt = a * b; print("Produkt (a * b) = $produkt"); // Output: 30 // Division (returnerer double) var division = a / b; print("Division (a / b) = $division"); // Output: 3.333... // Heltalsdivision var heltalDivision = a ~/ b; print("Heltalsdivision (a ~/ b) = $heltalDivision"); // Output: 3 // Modulus (rest) var rest = a % b; print("Rest (a % b) = $rest"); // Output: 1 }2. Relationelle Operatorer (Sammenligningsoperatorer)
Disse operatorer bruges til at sammenligne to værdier. Resultatet af en sammenligning er altid en boolesk værdi: true eller false. De er afgørende for at kunne træffe beslutninger i kode, for eksempel i if-sætninger og loops.
| Symbol | Navn | Beskrivelse |
|---|---|---|
| > | Større end | Returnerer true hvis venstre operand er større end højre. |
| < | Mindre end | Returnerer true hvis venstre operand er mindre end højre. |
| >= | Større end eller lig med | Returnerer true hvis venstre operand er større end eller lig med højre. |
| <= | Mindre end eller lig med | Returnerer true hvis venstre operand er mindre end eller lig med højre. |
| == | Lig med | Returnerer true hvis de to operander er lig med hinanden. |
| != | Ikke lig med | Returnerer true hvis de to operander ikke er lig med hinanden. |
// Dansk eksempel på relationelle operatorer void main() { int x = 5; int y = 8; print("Er x større end y? ${x > y}"); // Output: false print("Er x mindre end y? ${x < y}"); // Output: true print("Er x lig med y? ${x == y}"); // Output: false print("Er x ikke lig med y? ${x != y}"); // Output: true }3. Logiske Operatorer
Logiske operatorer bruges til at kombinere to eller flere booleske udtryk. De er fundamentale i kontrolstrukturer, der kræver komplekse betingelser.
| Symbol | Navn | Beskrivelse |
|---|---|---|
| && | Logisk OG (AND) | Returnerer true kun hvis begge operander er true. |
| || | Logisk ELLER (OR) | Returnerer true hvis mindst én af operanderne er true. |
| ! | Logisk IKKE (NOT) | Inverterer en boolesk værdi (true bliver false og omvendt). |
Vigtigt: I Dart kan logiske operatorer kun anvendes på booleske værdier. I modsætning til nogle andre sprog betragtes tal, der ikke er nul, ikke som true.
The following table lists the operator precedence in Dart, from highest to lowest. Operators with higher precedence are evaluated before those with lower precedence. Operators on the same row have equal precedence and are evaluated according to associativity rules. , (), ., ?. ++, --, +, -, ! >, <, >=, <=, is, is! ??[/caption]
// Dansk eksempel på logiske operatorer void main() { bool a = true; bool b = false; int alder = 25; print("a && b: ${a && b}"); // Output: false print("a || b: ${a || b}"); // Output: true print("!a: ${!a}"); // Output: false // Praktisk eksempel if (alder > 18 && alder < 65) { print("Personen er i den arbejdsdygtige alder."); } }4. Tildelingsoperatorer
Disse bruges til at tildele værdier til variabler. Den mest basale er lighedstegnet (=).
| Symbol | Navn | Beskrivelse |
|---|---|---|
| = | Tildeling | Tildeler værdien fra højre side til variablen på venstre side. |
| ??= | Null-aware tildeling | Tildeler en værdi til en variabel, kun hvis variablen er null. |
Sammensatte Tildelingsoperatorer
Dart tilbyder også sammensatte tildelingsoperatorer, der kombinerer en aritmetisk eller bitvis operation med en tildeling. Dette giver en mere kompakt syntaks.
Eksempler inkluderer +=, -=, *=, /=. For eksempel er x += 5 en kortere måde at skrive x = x + 5 på.
// Dansk eksempel på tildelingsoperatorer void main() { int a = 10; int? b; // Nullable variabel // Simpel tildeling a = 15; print("a's nye værdi: $a"); // Output: 15 // Null-aware tildeling b ??= 20; print("b's værdi (efter ??=): $b"); // Output: 20 b ??= 30; // Denne linje har ingen effekt, da b ikke længere er null print("b's værdi (efter andet forsøg): $b"); // Output: 20 // Sammensat tildeling a += 5; // Svarer til a = a + 5 print("a efter += 5: $a"); // Output: 20 }5. Bitvise Operatorer
Bitvise operatorer arbejder direkte på den binære repræsentation af heltal. De bruges ofte i lavniveaus programmering, såsom driverudvikling eller når man arbejder med datakomprimering eller kryptering.
| Symbol | Navn | Beskrivelse |
|---|---|---|
| & | Bitvis AND | Udfører en AND-operation på hvert par af korresponderende bits. |
| | | Bitvis OR | Udfører en OR-operation på hvert par af korresponderende bits. |
| ^ | Bitvis XOR | Udfører en XOR-operation på hvert par af korresponderende bits. |
| ~ | Bitvis NOT (Komplement) | Inverterer alle bits i en operand. |
| << | Venstre skift | Skifter bits til venstre og fylder op med nuller fra højre. |
| >> | Højre skift | Skifter bits til højre. |
6. Betingede Operatorer
Disse operatorer giver en kortfattet måde at evaluere udtryk baseret på en betingelse.
- Ternær Operator (
? :): Dette er en kompakt erstatning for enif-else-sætning. Syntaksen erbetingelse ? udtryk1: udtryk2. Hvis betingelsen ertrue, evalueresudtryk1; ellers evalueresudtryk2. - Null Coalescing Operator (
??): Denne operator returnerer udtrykket på venstre side, hvis det ikke ernull; ellers evaluerer og returnerer den udtrykket på højre side. Det er en elegant måde at give standardværdier for nullable variabler.
// Dansk eksempel på betingede operatorer void main() { int alder = 20; String status = (alder >= 18) ? "Voksen": "Mindreårig"; print("Status: $status"); // Output: Voksen String? navn; String brugernavn = navn ?? "Gæst"; print("Brugernavn: $brugernavn"); // Output: Gæst }7. Kaskadeoperator (..)
Kaskadeoperatoren giver dig mulighed for at udføre en sekvens af operationer på det samme objekt. Dette kan gøre koden mere flydende og letlæselig, da du undgår at skulle gentage objektets navn.
The operators are special symbols used to perform certain operations on operands. Dart has numerous built-in operators that can be utilized for various functions; for example, '+' is used to add two operands. Operators are designed to execute operations on one or two operands. expr++ expr-- () ? . ?. ! >= > <= < as is is! ?? .. ?..[/caption]
class Bruger { String? fornavn; String? efternavn; void visNavn() { print("$fornavn $efternavn"); } } void main() { var bruger = Bruger() ..fornavn = "Jens" ..efternavn = "Hansen" ..visNavn(); // Output: Jens Hansen }Operatorpræcedens
Når et udtryk indeholder flere operatorer, bestemmer præcedens rækkefølgen, de evalueres i. For eksempel har multiplikation (*) højere præcedens end addition (+). Derfor vil 3 + 5 * 2 blive evalueret som 3 + (5 * 2), hvilket giver 13. Man kan bruge parenteser () til at overstyre den normale præcedens og tvinge en bestemt evalueringsrækkefølge.
Tabel over Operatorpræcedens (Forenklet)
| Præcedens | Operator(er) | Beskrivelse |
|---|---|---|
| Højeste | (), [], ., ?. | Funktionskald, adgang til medlemmer |
++, --, !, -expr | Unære operatorer | |
*, /, %, ~/ | Multiplikative | |
+, - | Additive | |
<<, >> | Bitvise skift | |
<, >, <=, >=, is, is! | Relationelle og type-test | |
==, != | Ligestilling | |
&& | Logisk AND | |
|| | Logisk OR | |
?? | Null-coalescing | |
? : | Ternær | |
| Laveste | =, +=, -=, ??=, etc. | Tildeling |
Ofte Stillede Spørgsmål (FAQ)
Hvad er forskellen på `/` og `~/` i Dart?
Operatoren / udfører standarddivision og returnerer altid et resultat af typen double (f.eks. 5 / 2 er 2.5). Operatoren ~/ udfører heltalsdivision og returnerer kun heltalsdelen af resultatet som en int (f.eks. 5 ~/ 2 er 2).
Hvad er nul-sikkerhed og hvordan hjælper operatorer med det?
Nul-sikkerhed (null safety) er en funktion i Dart, der hjælper med at forhindre fejl forårsaget af utilsigtede null-værdier. Operatorer som ?? (null coalescing), ??= (null-aware assignment) og ?. (conditional member access) er designet til at gøre det nemmere og mere sikkert at arbejde med variabler, der kan være null, ved at tilbyde elegante måder at håndtere disse tilfælde på.
Kan jeg bruge `==` til at sammenligne objekter?
Ja, == kan bruges til at sammenligne objekter. Som standard tjekker == for reference-lighed (om to variabler peger på det præcis samme objekt i hukommelsen). Dog kan klasser overskrive == operatoren for at implementere en værdi-baseret lighed (f.eks. at to `Bruger`-objekter betragtes som ens, hvis deres ID er det samme).
Hvorfor får jeg en fejl, når jeg bruger `&&` med heltal?
I Dart er de logiske operatorer && og || strengt defineret til at fungere med booleske værdier (true/false). Forsøg på at bruge dem med andre typer, som f.eks. heltal, vil resultere i en kompileringsfejl. Du skal først konvertere dine tal til en boolesk betingelse, f.eks. (a > 0) && (b > 0).
Hvis du vil læse andre artikler, der ligner Dart-operatorer: En Komplet Guide, kan du besøge kategorien Sundhed.
