Operatoru C # prioritāte un asociētība: definīcija un piemēri

Š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 3ir saistīts ar +un *. Kā teikts iepriekš, reizināšanai ir augstāka prioritāte nekā saskaitīšanai. Tātad operācija 3 * 5tiek veikta nevis 4 + 3. Mainīgā x vērtība būs 19.

Ja pievienošanai būtu augstāka prioritāte, tā 4 + 3vispirms 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āte
Kategorija 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 * bvispirms 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ācija
Kategorija 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

Interesanti raksti...