26/12/2002
I programmeringens verden er evnen til at sammenligne data fundamental. Uden denne evne ville vores programmer ikke kunne træffe beslutninger, sortere lister eller validere input. Kernen i denne funktionalitet ligger i det, vi kalder relationelle operatorer. En relationel operator er en konstruktion eller et symbol i et programmeringssprog, der tester eller definerer en form for relation mellem to enheder, kaldet operander. Disse operatorer bruges oftest til at skabe testudtryk, der styrer programmets flow, f.eks. i if-sætninger eller while-løkker. Resultatet af en sammenligning med en relationel operator er altid en boolsk værdi: enten sand (true) eller falsk (false).

Hvad er de grundlæggende relationelle operatorer?
Selvom syntaksen kan variere en smule mellem forskellige sprog, er der seks almindeligt anerkendte relationelle operatorer. Disse danner grundlaget for de fleste logiske sammenligninger, du vil støde på. De bruges til at skabe såkaldte Boolske udtryk, fordi de, når de evalueres, resulterer i en boolsk værdi.
Her er en oversigt over de seks mest almindelige operatorer:
| Operator | Betydning | Eksempel | Resultat (sand/falsk) |
|---|---|---|---|
| < | Mindre end | 5 < 10 | Sand |
| > | Større end | 10 > 5 | Sand |
| <= | Mindre end eller lig med | 5 <= 5 | Sand |
| >= | Større end eller lig med | 10 >= 12 | Falsk |
| == | Lig med (ligestilling) | 5 == 5 | Sand |
| != eller <> | Ikke lig med (ulighed) | 5 != 10 | Sand |
Det er vigtigt at bemærke en almindelig faldgrube for nye programmører: Forskellen mellem tildelingsoperatoren (=) og ligestillingsoperatoren (==). I mange sprog som C++, Java, og Python bruges et enkelt lighedstegn (=) til at tildele en værdi til en variabel (f.eks. x = 5), mens et dobbelt lighedstegn (==) bruges til at sammenligne to værdier for at se, om de er ens.
Dyk ned i begrebet 'Ligestilling' (Equality)
Ligestillingsoperatoren (==) virker simpel på overfladen, men den kan gemme på en del kompleksitet, især i objektorienteret programmering. Diskussionen om ligestilling rejser ofte spørgsmål om datatyper, nedarvning og identitet. Det er nødvendigt at skelne mellem flere niveauer af 'enshed':
- To forskellige objekter af samme type (f.eks. to separate computer-mus).
- To objekter, der er ens, men adskilte (f.eks. to 100-kronesedler).
- To objekter, der er ens, men har forskellig repræsentation (f.eks. en 10-krone og to 5-kroner).
- To forskellige referencer til det samme objekt (f.eks. to kaldenavne for den samme person).
I mange moderne programmeringssprog tilgås objekter og datastrukturer via referencer (pointers). Dette skaber et behov for at teste for to forskellige typer af ligestilling:
Lokationslighed (Identity)
Dette tester, om to referencer (lad os kalde dem A og B) peger på præcis det samme objekt i computerens hukommelse. Hvis A og B har lokationslighed, er enhver interaktion med objektet via A identisk med den samme interaktion via B. En ændring foretaget via reference A vil øjeblikkeligt kunne ses via reference B.
Indholdslighed (Content Equality)
Dette tester, om de objekter, som to referencer peger på, er ækvivalente i en eller anden forstand. Dette kan opdeles yderligere:
- Strukturel lighed: Indholdet af objekterne er det samme. Dette kan være en 'overfladisk' sammenligning (shallow comparison), der kun tester de umiddelbare underdele, eller en 'dyb' sammenligning (deep comparison), der rekursivt tester for lighed i alle underdele.
- Skræddersyet lighed: En specialdefineret form for lighed, der bevarer den eksterne adfærd. For eksempel betragtes brøkerne 1/2 og 2/4 som ens, når de ses som rationelle tal, selvom deres tællere og nævnere er forskellige.
Normalt indebærer lokationslighed også indholdslighed, men det omvendte er ikke nødvendigvis sandt. To forskellige streng-objekter kan være adskilte i hukommelsen (ikke lokationslighed), men indeholde den samme sekvens af tegn (indholdslighed).
Sammenligning på tværs af datatyper
I dynamisk typede sprog som JavaScript og PHP kan sammenligninger blive endnu mere komplekse. Standard ligestillingsoperatoren (==) anvender ofte det, man kalder løs typning (loose typing). Det betyder, at operatoren kan evaluere til 'sand', selvom to værdier er af forskellige typer, hvis sproget kan konvertere den ene type til den anden. For eksempel vil udtrykket 4 == "4" evaluere til 'sand' i JavaScript, fordi tekststrengen "4" kan konverteres til tallet 4 før sammenligningen.
Denne adfærd kan føre til uventede resultater og fejl, som kan være svære at finde. For at imødekomme dette tilbyder mange af disse sprog også en streng ligestillingsoperator (ofte ===). Den strenge ligestillingsoperator returnerer kun 'sand', hvis både værdierne og datatyperne er identiske. Derfor vil 4 === "4" evaluere til 'falsk', hvilket ofte er den ønskede og mere forudsigelige adfærd.

Ordning og sortering af data
Relationelle operatorer som 'større end' (>) og 'mindre end' (<) er ikke kun forbeholdt tal. Når de anvendes på ikke-numeriske data, såsom tekststrenge, følger de en bestemt sorteringskonvention. For tekst er dette typisk leksikografisk rækkefølge (alfabetisk rækkefølge). 'a' kommer før 'b', og 'apple' kommer før 'banana'.
I mange sorteringsalgoritmer er det afgørende at have en effektiv sammenligningsfunktion. Ofte anvendes en konvention, hvor en sammenligningsfunktion mellem to elementer, a og b, returnerer:
-1hvis a < b0hvis a = b1hvis a > b
Dette trevejs-sammenligningsprincip bruges af standardbiblioteksfunktioner som strcmp i C og forventes af sorteringsfunktioner som qsort. Effektiviteten af sammenligningskoden er kritisk, da den er en af de primære faktorer, der bidrager til den samlede ydeevne for en sorteringsalgoritme.
Ofte Stillede Spørgsmål (FAQ)
Hvad er forskellen på '=' og '==' i de fleste programmeringssprog?
Dette er en klassisk fejl for begyndere. Et enkelt lighedstegn, =, er tildelingsoperatoren. Den bruges til at give en variabel en værdi, f.eks. minAlder = 30. Et dobbelt lighedstegn, ==, er ligestillingsoperatoren. Den bruges til at sammenligne to værdier for at se, om de er ens, og returnerer enten sand eller falsk, f.eks. if (minAlder == 30).
Hvorfor er det vigtigt at kende forskel på lokations- og indholdslighed?
Når man arbejder med objekter, er det afgørende at vide, om man sammenligner referencerne (adresserne i hukommelsen) eller selve objekternes indhold. Hvis du vil tjekke, om to variabler peger på præcis det samme objekt, bruger du en test for lokationslighed. Hvis du vil vide, om to forskellige objekter har de samme egenskaber (f.eks. to kundeobjekter med samme navn og adresse), skal du bruge en test for indholdslighed.
Hvad betyder det, at lighed kan være intransitiv?
I nogle sprog med løs typning kan man opleve, at a == b er sandt, og b == c er sandt, men a == c er falsk. Dette bryder den matematiske regel om transitivitet og kan opstå på grund af sprogets komplekse regler for typekonvertering. Dette er en stærk grund til altid at bruge den strenge ligestillingsoperator (===), når den er tilgængelig.
Hvis du vil læse andre artikler, der ligner Relationelle Operatorer i Programmering Forklaret, kan du besøge kategorien Sundhed.
