Tässä opetusohjelmassa opit operaattorin etusijasta ja assosiatiivisuudesta C #: ssa. Tämä antaa meille käsityksen siitä, miten C #-kääntäjä arvioi lausekkeen.
C # Operaattorin etusija
Operaattorin etusija on joukko sääntöjä, jotka määrittelevät lausekkeen arvioinnin. Kohdassa C # jokaisella C # -operaattorilla on määritetty prioriteetti ja näiden prioriteettien perusteella lauseke arvioidaan.
Esimerkiksi kertolaskuoperaattorin etusija (*)
on suurempi kuin lisäysoperaattorin etusija (+)
. Siksi kertolaskuoperaatio suoritetaan ennen lisäämistä.
Katso alla oleva lausunto.
int x = 4 + 3 * 5;
Mikä on x: n arvo tämän käskyn suorittamisen jälkeen?
Operandi 3
liittyy +
ja *
. Kuten aiemmin todettiin, kertolasku on etusijalla kuin summaus. Joten, operaatio 3 * 5
suoritetaan sijasta 4 + 3
. Muuttujan x arvo on 19
.
Jos lisäyksellä olisi korkeampi etusija, 4 + 3
se arvioidaan ensin ja x: n arvo olisi 35
.
Operaattorin prioriteettitaulukko
Mitä suurempi operaattorin etusija on, sitä korkeampi se näkyy taulukossa
C # Operaattorin etusijaKategoria | Operaattorit |
---|---|
Postfixin lisäys ja vähennys | ++, - |
Etuliitteen lisäys, vähennys ja unary | ++, -, +, -,!, ~ |
Kerroin | *, /,% |
Lisäaine | +, - |
Siirtää | <> |
Suhteellinen | <,,> = |
Tasa-arvo | ==,! = |
Bittikohtaisesti JA | & |
Bitteittäin XOR | ^ |
Bittiä TAI | | |
Looginen JA | && |
Looginen TAI | || |
Ternary | ? : |
Tehtävä | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Määritysoperaattoreilla on pienin etusija, kun taas jälkikorjauksen lisäys- ja vähennysoperaattoreilla on korkein prioriteetti.
Esimerkki 1: Operaattorin etusija
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); ) ) )
Kun suoritamme ohjelmaa, tulos on:
19 Väärä
Ymmärretään miten lauseketta arvioidaan ohjelmassa.
Edeltävyys --
ja ++
on suurempi kuin *
, ja etusija *
on suurempi kuin -
. Siksi lausunto,
tulos1 = --a * b - ++ c;
vastaa
tulos1 = ((--a) * b) - (++ c);
Suluissa oleva ilmaisu arvioidaan aina ensin riippumatta siitä, mikä on operaattoreiden etusija sen ulkopuolella.
- Aluksi (--a) arvioidaan tulokseksi
4
. - Sitten (++ c) arvioidaan tulokseksi
5
. - Nyt (a * b) arvioidaan tulokseksi
24
. - Lopuksi vähennys suoritetaan tuloksena
19
. - Näin ollen tuloksen1 lopullinen arvo on
19
.
Seuraavassa lausekkeessa etusija +
on suurempi kuin >=
. Joten c ja a lisätään ensin ja summaa verrataan b: hen tuottamiseksi false
.
Operaattoreiden assosiatiivisuus C #
Edellisessä osassa keskustelimme operaattorin etusijasta. Jos käytetään kahta eri etusijalla olevaa operaattoria, ensin arvioidaan korkeamman prioriteetin operaattori.
Mutta entä jos molemmilla operaattoreilla on sama etusija?
Tällöin lauseke arvioidaan operaattorin assosiatiivisuuden perusteella (vasemmalta oikealle tai oikealta vasemmalle).
Esimerkiksi:
int a = 5, b = 6, c = 3; int tulos = a * b / c;
Nyt molemmat *
ja /
on sama etusija. Mutta koska näiden operaattorien assosiatiivisuus on vasemmalta oikealle , a * b
se arvioidaan ensin ja sitten jako suoritetaan. Tämän lausekkeen lopputulos on 10
.
Tässä nimenomaisessa esimerkissä assosiatiivisuudella ei ole väliä. Koska vaikka jakaminen suoritettaisiin ennen kertomista, tulos ei vaikuttaisi.
Katsotaanpa toinen esimerkki.
int a = 5, b = 6, c = 3; a = b = c;
=
Operaattorin assosiatiivisuus on oikealta vasemmalle . Joten c: n (ts. 3
) Arvo osoitetaan b: lle ja sitten b: n arvo a: lle. Joten tämän lauseen suorittamisen jälkeen a: n, b: n ja c: n arvot ovat 3
.
Seuraava taulukko osoittaa C # -operaattorien assosiatiivisuuden:
C # Operaattoreiden assosiatiivisuusKategoria | Operaattorit | Assosiatiivisuus |
---|---|---|
Postfixin lisäys ja vähennys | ++, - | Vasemmalta oikealle |
Etuliitteen lisäys, vähennys ja unary | ++, -, +, -,!, ~ | Oikealta vasemmalle |
Kerroin | *, /,% | Vasemmalta oikealle |
Lisäaine | +, - | Vasemmalta oikealle |
Siirtää | <> | Vasemmalta oikealle |
Suhteellinen | <,,> = | Vasemmalta oikealle |
Tasa-arvo | ==,! = | Vasemmalta oikealle |
Bittikohtaisesti JA | & | Vasemmalta oikealle |
Bitteittäin XOR | ^ | Vasemmalta oikealle |
Bittiä TAI | | | Vasemmalta oikealle |
Looginen JA | && | Vasemmalta oikealle |
Looginen TAI | || | Vasemmalta oikealle |
Ternary | ? : | Oikealta vasemmalle |
Tehtävä | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Oikealta vasemmalle |
Lähes kaikilla operaattoreilla on assosiatiivisuutta vasemmalta oikealle. Operaattorit, joilla on assosiatiivisuutta oikealta vasemmalle, ovat:
- Unary-operaattorit
- Etuliitteen lisäys- ja vähennysoperaattorit
- Ternary Operaattori
- Tehtäväoperaattorit
Esimerkki 2: Operaattoreiden assosiatiivisuus
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); ) ) )
Kun suoritamme ohjelmaa, tulos on:
10 a = 3, b = 3, c = 3