Wat is Kortsluitevaluatie (short-circuit evaluation)?

Een manier om de logische operatoren and en or te evalueren waarbij de rechterkant wordt overgeslagen als de linkerkant alleen het resultaat al bepaalt. Bij and wordt de rechterkant niet geëvalueerd als de linkerkant onwaar is, bij or als de linkerkant waar is. Het wordt vaak gebruikt om toegang buiten het bereik te voorkomen door de bereikcontrole van de array aan de linkerkant te zetten.

Japanse benaming: 短絡評価

“Kortsluitevaluatie (short-circuit evaluation)” komt voor in 4 oefenvragen uit 3 onderwerpen, bijv. Basis van programmeren (pseudocode traceren), Basis van programmeren in C, Softwareontwikkeling en projectmanagement.

Vakgebied: Basis van programmeren (pseudocode traceren)

Wanneer het het resultaat verandert

Als de rechterkant een functieaanroep of een element van een array bevat, kan het resultaat ervan afhangen of de evaluatie wordt kortgesloten. In „i ≦ n and a[i] ≠ x” is de linkerkant onwaar zodra i groter is dan n, dus a[i] wordt niet buiten de array gelezen. Als je de twee kanten verwisselt, wordt eerst buiten de array gelezen. Als een functie die aan de rechterkant wordt aangeroepen variabelen wijzigt, verandert ook het aantal keren dat ze wordt aangeroepen.

In programmeertalen

In veel talen, zoals C, Java en Python, gebruiken de logische operatoren && en || (and en or in Python) kortsluitevaluatie. In C en Java evalueren & en | altijd beide kanten. Als kortsluitevaluatie in een vraag in pseudocode het resultaat beïnvloedt, volg dan de uitleg in de vraag.

Voorwaarden ermee schrijven

Met kortsluitevaluatie kun je in één expressie een voorwaarde schrijven die alleen zin heeft als een eerdere voorwaarde geldt, zoals „binnen het bereik van de array, en dat element voldoet aan de voorwaarde”. Een tijdrovende test aan de rechterkant wordt overgeslagen als de linkerkant het resultaat al bepaalt. Anderzijds hoort werk dat altijd moet worden uitgevoerd niet in een functie aan de rechterkant, omdat die misschien niet wordt aangeroepen.

Nu oefenen: vragen over Kortsluitevaluatie (short-circuit evaluation)

Voor de beslissing „A en B” (A en B zijn voorwaarden waarvan de waarheidswaarden onafhankelijk kunnen worden gekozen) zijn twee testgevallen uitgevoerd: (A = waar, B = onwaar) en (A = onwaar, B = waar). Welke uitspraak over de dekkingscriteria is juist?

  1. ATakdekking is bereikt, maar conditiedekking niet
  2. BZowel takdekking als conditiedekking is bereikt
  3. CConditiedekking is bereikt, maar takdekking niet
Antwoord en toelichting tonen

Antwoord: C. Conditiedekking is bereikt, maar takdekking niet

Conditiedekking vereist dat elke afzonderlijke voorwaarde in een beslissing (A en B) minstens één keer waar en één keer onwaar is. In de twee testgevallen zijn A en B elk één keer waar en één keer onwaar, dus conditiedekking is bereikt. „A en B” is echter in beide testgevallen onwaar, en de tak voor een ware beslissing wordt nooit genomen, dus takdekking is niet bereikt. Omdat conditiedekking alleen geen takdekking garandeert, worden criteria gebruikt die aan beide voldoen, zoals beslissings-/conditiedekking. Merk op dat deze redenering uitgaat van de waarden die aan elke voorwaarde worden gegeven; bij kortsluitevaluatie, zoals met && in C, waarbij de rechterkant niet wordt geëvalueerd als de linkerkant onwaar is, kan men ook alleen de voorwaarden tellen die werkelijk zijn geëvalueerd.

Veelgestelde vragen

Is kortsluitevaluatie een optimalisatie?

In C, Java, Python en vergelijkbare talen is kortsluitevaluatie geen compileroptimalisatie maar onderdeel van de taaldefinitie. Programma's die erop rekenen dat de rechterkant niet wordt geëvalueerd, werken daarom gegarandeerd correct.

Zijn not (A or B) en not A and not B hetzelfde?

Volgens de stelling van De Morgan hebben ze dezelfde waarheidswaarde. Zowel not (i > n or a[i] = x) als i ≦ n and a[i] ≠ x slaat de evaluatie van a[i] over als de voorwaarde op i alleen het resultaat al bepaalt.

“Kortsluitevaluatie (short-circuit evaluation)” in de toelichting

Vragen met “Kortsluitevaluatie (short-circuit evaluation)” (4)

  1. In het volgende programma evalueert and de rechterkant niet als de linkerkant false is (kortsluitevaluatie). cnt is een globale variabele. Wat is de waarde van cnt nadat het programma is uitgevoerd?
  2. Het volgende programma zoekt de waarde x in de array a met n elementen en zet de index waar die wordt gevonden in i. Array-indexen beginnen bij 1. and en or evalueren hun rechterkant niet als de linkerkant alleen het resultaat al bepaalt. Welke voorwaarde op de plaats van 【a】 leest a[n + 1], buiten de array, als x niet in a voorkomt?
  3. Wat is de uitvoer als de bovenstaande code, met b++ aan de rechterkant van && en ||, wordt uitgevoerd?
  4. Voor de beslissing „A en B” (A en B zijn voorwaarden waarvan de waarheidswaarden onafhankelijk kunnen worden gekozen) zijn twee testgevallen uitgevoerd: (A = waar, B = onwaar) en (A = onwaar, B = waar). Welke uitspraak over de dekkingscriteria is juist?

Verwante termen

Variabele Array Takdekking (branch coverage) Afrondingsfout Argument Bitsgewijze bewerking (bitwise operation) Controlestructuur Gehele deling (integer division) Modulo-operatie Objectgeoriënteerd programmeren

Naar de woordenlijst