Selles õpetuses saate teada operaatori prioriteedist ja assotsiatiivsusest C # -s. See annab meile aimu, kuidas avaldist C # kompilaator hindab.
C # Operaatori ülimuslikkus
Operaatori tähtsus on reeglite kogum, mis määratleb avaldise hindamise viisi. C # puhul on igal C # operaatoril määratud prioriteet ja nende prioriteetide põhjal hinnatakse avaldist.
Näiteks korrutamisoperaatori ülimuslikkus (*)
on suurem kui liitmisoperaatori ülimuslikkus (+)
. Seetõttu viiakse enne liitmist läbi korrutamine.
Heitke pilk allpool olevale avaldusele.
int x = 4 + 3 * 5;
Milline on x väärtus pärast selle lause täitmist?
Operand 3
on seotud +
ja *
. Nagu varem öeldud, on korrutamisel suurem eelistus kui liitmisel. Niisiis, operatsioon 3 * 5
viiakse läbi asemel 4 + 3
. Muutuja x väärtus on 19
.
Kui liitmisel oleks kõrgem tähtsus, 4 + 3
hinnatakse seda kõigepealt ja x väärtus oleks 35
.
Operaatori tähtsuse tabel
Mida suurem on operaatori paremus, seda suurem on see tabelis
C # Operaatori ülimuslikkusKategooria | Operaatorid |
---|---|
Postfixi kasv ja kahanemine | ++, - |
Prefiksi juurdekasv, kahanev ja unaarne | ++, -, +, -,!, ~ |
Mitmekordne | *, /,% |
Söödalisand | +, - |
Shift | <> |
Suhteline | <,,> = |
Võrdsus | ==,! = |
Pikkade kaupa JA | & |
Piki XOR | ^ |
Piki VÕI | | |
Loogiline JA | && |
Loogiline VÕI | || |
Kolmepoolne | ? : |
Ülesanne | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Omistamise operaatoritel on kõige madalam prioriteet, samas kui postfixi juurdekasvu ja vähendamise operaatoritel on kõige suurem tähtsus.
Näide 1: Operaatori ülimuslikkus
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int result1; int a = 5, b = 6, c = 4; result1 = --a * b - ++c; Console.WriteLine(result1); bool result2; result2 = b>= c + a; Console.WriteLine(result2); ) ) )
Programmi käivitamisel on väljund:
19 Vale
Saame aru, kuidas väljendit programmis hinnatakse.
Eelisjärjestus --
ja ++
on suurem kui *
, ja ülimuslikkus *
on suurem kui -
. Siit ka väide,
tulemus1 = --a * b - ++ c;
on samaväärne
tulemus1 = ((--a) * b) - (++ c);
Sulgudes sisalduvat väljendit hinnatakse alati kõigepealt, hoolimata sellest, milline on väljaspool seda asuvate operaatorite tähtsus.
- Alguses hinnatakse (--a), mille tulemuseks on
4
. - Seejärel hinnatakse (++ c) tulemuseks
5
. - Nüüd hinnatakse (a * b) tulemuseks
24
. - Lõpuks tehakse lahutamine, mille tulemuseks on
19
. - Seega on tulemuse1 lõplik väärtus
19
.
Järgmises avaldises on ülimuslikkus +
suurem kui >=
. Niisiis lisatakse kõigepealt c ja a ning saadava summa saamiseks võrreldakse b-d false
.
C # operaatorite assotsiatiivsus
Eelmises osas käsitlesime operaatori eelistamist. Kui kasutatakse kahte erineva tähtsusega operaatorit, hinnatakse kõigepealt kõrgema tähtsusega operaatorit.
Aga mis siis, kui mõlemal operaatoril on sama ülimuslikkus?
Sellisel juhul hinnatakse väljendit operaatori assotsiatiivsuse põhjal (vasakult paremale või paremalt vasakule).
Näiteks:
int a = 5, b = 6, c = 3; int tulemus = a * b / c;
Siin on mõlemal *
ja /
sama ülimuslikkus. Kuid kuna nende operaatorite assotsiatiivsus on vasakult paremale , a * b
hinnatakse kõigepealt ja seejärel viiakse läbi jagamine. Selle väljendi lõpptulemus on 10
.
Selles konkreetses näites pole assotsiatiivsus tegelikult oluline. Sest isegi kui jagamine viiakse läbi enne korrutamist, ei mõjutaks see tulemust.
Vaatame veel ühte näidet.
int a = 5, b = 6, c = 3; a = b = c;
=
Operaatori assotsiatiivsus on paremalt vasakule . Niisiis määratakse väärtus 3
b (st ) b-le ja seejärel b väärtus a-le. Nii et pärast selle lause täitmist on a, b ja c väärtused 3
.
Allpool olev tabel näitab C # operaatorite assotsiatiivsust:
C # Operaatorite assotsiatiivsusKategooria | Operaatorid | Assotsiatiivsus |
---|---|---|
Postfixi kasv ja kahanemine | ++, - | Vasakult paremale |
Prefiksi juurdekasv, kahanev ja unaarne | ++, -, +, -,!, ~ | Paremalt vasakule |
Mitmekordne | *, /,% | Vasakult paremale |
Söödalisand | +, - | Vasakult paremale |
Shift | <> | Vasakult paremale |
Suhteline | <,,> = | Vasakult paremale |
Võrdsus | ==,! = | Vasakult paremale |
Pikkade kaupa JA | & | Vasakult paremale |
Piki XOR | ^ | Vasakult paremale |
Piki VÕI | | | Vasakult paremale |
Loogiline JA | && | Vasakult paremale |
Loogiline VÕI | || | Vasakult paremale |
Kolmepoolne | ? : | Paremalt vasakule |
Ülesanne | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Paremalt vasakule |
Peaaegu kõigil operaatoritel on assotsiatiivsus vasakult paremale. Operaatorid, kellel on assotsiatiivsus paremalt vasakule, on:
- Unary operaatorid
- Prefiksi kasvu- ja kahanemisoperaatorid
- Kolmepoolne operaator
- Ülesandeoperaatorid
Näide 2: Operaatorite assotsiatiivsus
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int a = 5, b = 6, c = 3; int result = a * b / c; Console.WriteLine(result); a = b = c; Console.WriteLine("a = (0), b = (1), c = (2)", a, b, c); ) ) )
Programmi käivitamisel on väljund:
10 a = 3, b = 3, c = 3