Šajā apmācībā mēs uzzināsim par operatora prioritāti un asociativitāti C #. Tas mums dos priekšstatu par to, kā izteicienu novērtē C # kompilators.
C # Operatora prioritāte
Operatora prioritāte ir noteikumu kopums, kas nosaka, kā izteiksme tiek vērtēta. C # katram C # operatoram ir piešķirta prioritāte, un, pamatojoties uz šīm prioritātēm, tiek vērtēta izteiksme.
Piemēram , reizināšanas (*)
operatora prioritāte ir augstāka nekā pievienošanas (+)
operatora prioritāte . Tāpēc pirms pievienošanas tiek veikta darbība, kas saistīta ar reizināšanu.
Apskatiet zemāk esošo paziņojumu.
int x = 4 + 3 * 5;
Kāda būs x vērtība pēc šī paziņojuma izpildes?
Operands 3
ir saistīts ar +
un *
. Kā teikts iepriekš, reizināšanai ir augstāka prioritāte nekā saskaitīšanai. Tātad operācija 3 * 5
tiek veikta nevis 4 + 3
. Mainīgā x vērtība būs 19
.
Ja pievienošanai būtu augstāka prioritāte, tā 4 + 3
vispirms tiktu novērtēta un x vērtība būtu 35
.
Operatora prioritātes tabula
Jo augstāka ir operatora prioritāte, jo augstāka tā parādās tabulā
C # Operatora prioritāteKategorija | Operatori |
---|---|
Postfix pieaugums un samazinājums | ++, - |
Prefiksa pieaugums, samazinājums un vienotais | ++, -, +, -,!, ~ |
Reizinošs | *, /,% |
Piedeva | +, - |
Shift | <> |
Relāciju | <,,> = |
Vienlīdzība | ==,! = |
Bitu virzienā UN | & |
Bitor XOR | ^ |
Bitwise OR | | |
Loģiski UN | && |
Loģiski VAI | || |
Trīskāršais | ? : |
Uzdevums | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Piešķiršanas operatoriem ir viszemākā prioritāte, bet pēcfiksa pieauguma un samazināšanas operatoriem ir visaugstākā prioritāte.
1. piemērs: Operatora prioritāte
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); ) ) )
Kad mēs palaidīsim programmu, izeja būs:
19 Nepatiesa
Sapratīsim, kā izteiksme tiek vērtēta programmā.
Priekšrocība --
un ++
ir augstāka par *
, un prioritāte *
ir augstāka par -
. Tādējādi paziņojums,
rezultāts1 = --a * b - ++ c;
ir ekvivalents
rezultāts1 = ((--a) * b) - (++ c);
Izteiksme iekavās vienmēr tiek vispirms novērtēta neatkarīgi no operatoru prioritātes ārpus tā.
- Sākumā tiek novērtēts (--a), iegūstot
4
. - Tad (++ c) tiek novērtēts, kā rezultātā iegūst
5
. - Tagad tiek novērtēts (a * b), kā rezultātā
24
. - Visbeidzot, atņemšana tiek veikta, iegūstot
19
. - Tādējādi rezultāta1 galīgā vērtība būs
19
.
Nākamajā izteiksmē prioritāte +
ir augstāka nekā >=
. Tātad vispirms tiek pievienots c un a, un summa tiek salīdzināta ar b, lai iegūtu false
.
Operatoru asociācija C #
Iepriekšējā sadaļā mēs apspriedām operatora prioritāti. Ja tiek izmantoti divi operatori ar atšķirīgu prioritāti, vispirms tiek novērtēts operators ar augstāku prioritāti.
Bet ko tad, ja abiem operatoriem ir vienāda prioritāte?
Šādā gadījumā izteiksme tiek vērtēta, pamatojoties uz operatora asociativitāti (no kreisās uz labo vai no labās uz kreiso).
Piemēram:
int a = 5, b = 6, c = 3; int rezultāts = a * b / c;
Te gan *
, un /
ir tāda pati prioritāte. Bet, tā kā šo operatoru asociativitāte ir no kreisās uz labo , a * b
vispirms tiek novērtēta un pēc tam tiek veikta sadalīšana. Šīs izteiksmes galīgais rezultāts būs 10
.
Šajā konkrētajā piemērā asociativitātei nav īsti nozīmes. Jo, pat ja dalīšana tiktu veikta pirms reizināšanas, rezultāts netiktu ietekmēts.
Apskatīsim citu piemēru.
int a = 5, b = 6, c = 3; a = b = c;
=
Operatora asociācija ir no labās uz kreiso . Tātad c (ti 3
) vērtība tiek piešķirta b, un pēc tam b vērtība tiek piešķirta a. Tātad pēc šī paziņojuma izpildīšanas a, b un c vērtības būs 3
.
Zemāk esošajā tabulā parādīta C # operatoru asociativitāte:
C # Operatoru asociācijaKategorija | Operatori | Asociativitāte |
---|---|---|
Postfix pieaugums un samazinājums | ++, - | No kreisās uz labo |
Prefiksa pieaugums, samazinājums un vienotais | ++, -, +, -,!, ~ | Pa labi pa kreisi |
Reizinošs | *, /,% | No kreisās uz labo |
Piedeva | +, - | No kreisās uz labo |
Shift | <> | No kreisās uz labo |
Relāciju | <,,> = | No kreisās uz labo |
Vienlīdzība | ==,! = | No kreisās uz labo |
Bitu virzienā UN | & | No kreisās uz labo |
Bitor XOR | ^ | No kreisās uz labo |
Bitwise OR | | | No kreisās uz labo |
Loģiski UN | && | No kreisās uz labo |
Loģiski VAI | || | No kreisās uz labo |
Trīskāršais | ? : | Pa labi pa kreisi |
Uzdevums | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Pa labi pa kreisi |
Gandrīz visiem operatoriem ir asociativitāte no kreisās uz labo. Operatori, kuriem asociācija ir no labās uz kreiso, ir:
- Unāri operatori
- Prefiksa pieauguma un samazināšanas operatori
- Trīskāršais operators
- Uzdevumu operatori
2. piemērs: Operatoru asociācija
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); ) ) )
Kad mēs palaidīsim programmu, izeja būs:
10 a = 3, b = 3, c = 3