2024(e)ko abenduaren 18(a), asteazkena

Operadoreen lehentasuna eta asoziatibitatea

Hurrengo taulako operadoreak lehentasunaren arabera zerrendatzen dira, handienetik txikienera. Operadore bat baino gehiago agertzen badira lerro berean edo talde batean, lehentasun bera dute eta asoziatibitateari begiratu beharko zaio hurrenkera jakiteko.

Azken lerroko esleipen-operadore soil eta esleipen-operadore konposatu guztiek lehentasun bera dute.

Operadoreen lehentasuna eta asoziatibitatea
(goitik beherako lehentasuna)
  Eragiketa mota      Asoziabilitatea                  Sinboloa
  1  Adierazpena
Ezkerretik eskumara
>>>
[] () . ->
++ --
 (atzizki)
  2  Unarioa
Eskumatik ezkerrera
<<<
sizeof & * + - ~ !
++ --
 (aurrizki)
  3  Behartzea
(edo typecast)
Eskumatik ezkerrera
<<<
(datu-mota)
  4 Biderkatzailea
Ezkerretik eskumara
>>>
*  %  /
  5  Batutzailea
Ezkerretik eskumara
>>>
+  - 
  6  Erlaziozkoa
Ezkerretik eskumara
>>>
>  <  >=  <=
  7  Berdintasuna
Ezkerretik eskumara
>>>
==  !=
  8  AND logikoa
Ezkerretik eskumara
>>>
&&
  9  OR logikoa
Ezkerretik eskumara
>>>
||
 10  Baldintzazko adierazpena
Eskumatik ezkerrera
<<<
?  :
 11  Esleipen soila
eta konposatua
Eskumatik ezkerrera
<<<
=   *=   /=   %=   +=   -=


Esan bezala, azken lerroko esleipen-operadoreek (soilak eta konposatuek) lehentasun berdina daukate.

Adierazpen batek lehentasun bera duten operadore bat baino gehiago izan ditzake. Mota horretako operadore batzuk adierazpenean maila berean agertzen direnean, ebaluazioak jarraitu egiten du, operadorearen asoziatibitatearen arabera, eskuinetik ezkerrera batzuetan eta ezkerretik eskuinera beste batzuetan. Beraz, adierazpen bat ebaluatzeko, lehentasunari begiratzen zaio lehenik eta gero asoziabilitateari.


Goiko taulari so eginez, ikus daiteke eragile aritmetikoek biderkatzaileak eta batutzaileak direla. Jarraian hiru adibide aurkeztuko dira: lehen adibidean behartze operadorea landuko dugu, bigarren adibidean parentesiak soberan ote dauden aztertuko da operadore biderkatzailekin lan egitean, eta, azkenik, hirugarren adibidean operadore biderkatzailea eta operadore batutzailea nahastuko dira.


Behartze operadorea nola aplikatu

Hau da OperadoreenLehentasuna_1.cbp proiektua non emaitza biak zilegiak diren, baina programa jakin batean bietariko bat ondo egongo den eta bestea txarto legokeen:

/* OperadoreenLehentasuna_1: behartze operadorea */

#include <stdio.h>   // printf() funtzioarako

int main()
{
   float fRadianak = 5.8;
   int iDobleOsoa;

   printf("\n   fRadianak = %.3f", fRadianak);
   printf("\n fRadianak*2 = %.3f\n", fRadianak*2);

   iDobleOsoa = (int)fRadianak*2;
   printf("\n iDobleOsoa = (int)fRadianak*2   ---> %d", iDobleOsoa);
   iDobleOsoa = (int)(fRadianak*2);
   printf("\n iDobleOsoa = (int)(fRadianak*2) ---> %d", iDobleOsoa);

   printf("\n\n");
   getchar();
   return 0;
}

Hona hemen OperadoreenLehentasuna_1.cbp proiektua exekutatzean lortzen den irteera:



Operadore biderkatzailekin parentesien beharra

OperadoreenLehentasuna_2.cbp proiektuan bi zeregin betetzen dira, fGraduak aldagaiari balioa ematea fRadianak ezaguna dela, eta, fSegundoenErdia aldagaiari balioa ematea fGraduak ezaguna dela. Lehen kasuan parentesiak guztiz derrigorrezkoa dira eta bigarren kasuan parentisirik ez da behar baina programa irakurterraza egitearren komenigarriak izan daitezke.

/* OperadoreenLehentasuna_2: parentesiak soberan? */

#include <stdio.h>   // printf() funtzioarako
#include <math.h>    // pow() funtziorako
#define PI 3.14

int main()
{
   float fRadianak = 5.8;
   float fGraduak;
   float fSegundoenErdia;

   printf("\n fRadianak = %.1f\n", fRadianak);

   fGraduak = fRadianak*360/(2*PI);
   printf("\n fGraduak = fRadianak*360/(2*PI) = %.3f", fGraduak);

   fGraduak = fRadianak*360/2*PI;
   printf("\n fGraduak = fRadianak*360/2*PI =  %.3f", fGraduak);


   printf("\n\n");
   fGraduak = 10.031;
   printf("\n fGraduak = %.3f\n", fGraduak);

   fSegundoenErdia = fGraduak*3600/2;
   printf("\n fSegundoenErdia = fGraduak*3600/2 =   %.3f", fSegundoenErdia);
   fSegundoenErdia = (fGraduak*3600)/2;
   printf("\n fSegundoenErdia = (fGraduak*3600)/2 = %.3f", fSegundoenErdia);

   printf("\n\n");
   getchar();
   return 0;
}

Hona hemen OperadoreenLehentasuna_2.cbp proiektua exekutatzean lortzen den irteera:

Biderkatzaileen asoziabilitatea ezkerretik eskumara doanez,
lehen adibidean parentesiak derrigorrezkoak dira


Operadore biderkatzailea eta operadore batutzailea konbinatuz

Hau da OperadoreenLehentasuna_3.cbp proiektua non emaitza biak zilegiak diren, baina programa jakin batean bietariko bat ondo egongo den eta bestea txarto legokeen:

/* OperadoreenLehentasuna_3: batutzaileak eta biderkatzaileak konbinatuz */

#include <stdio.h>   // printf() funtzioarako

int main()
{
   int iEmaitza;
   int iZbk_1 = 1;
   int iZbk_2 = 2;
   int iZbk_3 = 3;

   printf("\n");
   printf(" ===============================================\n");
   printf("    iEmaitza = iZbk_1 + iZbk_2 * iZbk_3 =   7\n");
   printf("    iEmaitza = (iZbk_1 + iZbk_2) * iZbk_3 = 9\n");
   printf(" ===============================================\n");

   printf("\n iZbk_1 = %d", iZbk_1);
   printf("\n iZbk_2 = %d", iZbk_2);
   printf("\n iZbk_3 = %d", iZbk_3);
   printf("\n\n");

   printf(" -----------------------------------------------");
   iEmaitza = iZbk_1 + iZbk_2 * iZbk_3;
   printf("\n    iZbk_1 + iZbk_2 * iZbk_3 =   %d", iEmaitza);
   iEmaitza = (iZbk_1 + iZbk_2) * iZbk_3;
   printf("\n    (iZbk_1 + iZbk_2) * iZbk_3 = %d\n", iEmaitza);
   printf(" -----------------------------------------------");
   printf("\n\n");

   getchar();
   return 0;
}

Hona hemen OperadoreenLehentasuna_3.cbp proiektua exekutatzean lortzen den irteera:





Eragile logikoek eta konparatzaileek beren eragigaien ebaluazioa bermatzen dute ezkerretik eskuinera (taulako 6., 7., 8. eta 9. errenkadak). Hala ere, adierazpenaren emaitza zehazteko behar diren eragigaien kopururik txikiena ebaluatzen dute, eta horri "zirkuitulaburraren" ebaluazioa esaten zaio. Beraz, baliteke adierazpen logikoaren eragigai batzuk ez ebaluatzea. Azter dezagun, adibidez, adierazpen logiko hau:
if (x>=5 && y==3)

Aurreko if adibidean AND operadore logikoak (&&) lehentasun txikiagoa du erlaziozko operadoreak baino (>=) eta berdintasunaren operadoreak baino (==). Hori dela eta, lehenik ezkerreko konparaketa ebaluatuko da eta, adibidez, x aldagaiaren balioa 4 balitz, orduan eskumako konparaketa ez litzateke ebaluatuko; izan ere, y aldagaiaren balioa edozein dela adierazpen logikoak FALSE emaitzara ebaluatuko litzateke x>=5 alderaketak FALSE balio duelako.

Baina, aurreko if adibidean AND operadore logikoaren ordez OR operadore logikoa (||) idatziko balitz, honek ere lehentasun txikiagoa du erlaziozko operadoreak baino (>=) eta berdintasunaren operadoreak baino (==). Hori dela eta, alderaketa biak ebaluatuko dira, lehenik ezkerreko konparaketa ebaluatuko da eta ondoren eskumako konparaketa ebaluatuko da:
if (x>=5 || y==3)
Izan ere, x txikiago 5 izan arren, baliteke y aldagaiaren balioa 3 izatea eta kasu horretan if aginduaren baldintza beteko litzateke.


Jakina denez, eslipen mota desberdinak daude: esleipen soila alde batetik eta esleipen konposatuak bestetik. Ikastaro honetan gehien-gehienetan esleipen soila erabiliko da.

Berrikus ditzagun lehentasun arauak adierazpen aritmetiko konplexu bat duen esleipen honetan:
iGraduOsoak = (int)( fRadianak*360/(2*PI) + (fHasiera*7)/pow(fAmaiera+0.2,PI) );

Adierazpen aritmetiko honetan bi parentesi multzo nagusi daude, baina biak ez dira berdinak:

  • (int) parentesia, taulako hirugarren lerroko behartze operadorea da
  • ( fRadianak*360/(2*PI) + (fHasiera*7)/pow(fAmaiera+0.2,PI) ) parentesia taulako lehen lerroko adierazpena delako, lehen-lehenik ebaluatuko da eta ondoren bere emaitzari behartze operadorea aplikatuko zaio
Beraz, aipatu ditugun parentesi nagusi biak ordena honetan ebaluatuko dira:
                II                           I
              ===== ----------------------------------------------------------               
iGraduOsoak = (int)( fRadianak*360/(2*PI) + (fHasiera*7)/pow(fAmaiera+0.2,PI) );

I izendatu dugun fRadianak*360/(2*PI) + (fHasiera*7)/pow(fAmaiera+0.2,PI) zatian hiru parentesi multzo daude eta hauek ere ez dira guztiz berdinak:

  • (2*PI) taulako lehen lerroko adierazpen operadorea da eta ezkerrean dagoelako ebaluatzen den aurrenekoa izango da
  • (fHasiera*7) taulako lehen lerroko adierazpen operadorea da, baina aurrekoaren eskuman dagoelako bigarrena izango da ebaluatze-segidan
  • (fAmaiera+0.2,PI) funtzio baten parametro-zerrenda mugatzeko parentesiak dira eta multzo honek aurreko biekin zerikusirik ez dauka, funtzioa ebaluatzeko unean aintzat hartuko da parentesi barnekoa
                II                           I
              ===== ----------------------------------------------------------               
iGraduOsoak = (int)( fRadianak*360/(2*PI) + (fHasiera*7)/pow(fAmaiera+0.2,PI) );
                                   ------   ============
                                      1           2
Hurrengoak ebaluatzen hiru biderkatzaileak izango dira eta ezkerreik eskumara ebaluatuko dira. Lehenik fRadianak*360, gero fRadianak*360/(2*PI) eta (fHasiera*7)/pow(fAmaiera+0.2,PI) bukatzeko; honelaxe: a, b eta c. Eskematikoki:
                II                           I
              ===== ----------------------------------------------------------               
iGraduOsoak = (int)( fRadianak*360/(2*PI) + (fHasiera*7)/pow(fAmaiera+0.2,PI) );
                                   ------   ============
                                      1           2
                     -------------
                           a   
                     --------------------         
                               b            ---------------------------------
                                                           c

Azkenik, batutzaile operadorearen txanda izango da eta horrela bukatzen da I zatiaren ebaluazioa. Helburuko iGraduOsoak aldagaiaren balioa II behartze operadoreari esker lortuko da.

Hona hemen OperadoreenLehentasuna_4.cbp proiektua exekutatzean lortzen den irteera:








  • OperadoreenLehentasuna_1.cbp | main.c  
  • OperadoreenLehentasuna_2.cbp | main.c  
  • OperadoreenLehentasuna_3.cbp | main.c  
  • OperadoreenLehentasuna_4.cbp | main.c  

 

iruzkinik ez:

Argitaratu iruzkina