- Suma: |
+ |
|
- Resta: |
- |
|
- Multiplicació: |
* |
|
- Divisió: |
/ |
|
- Mòdul: |
% |
|
- Autoincrement: |
++ |
/* augmenta una variable en 1 */ |
- Autodecrement: |
-- |
/* disminueix una variable en 1 */ |
Exemples:
int a,b,c; /* declaració de tres variables enteres */ a=2; b=a*6; c=(b+a)/(b-a); /* divisió entera */ c++; /* c = c + 1 */
- Igual: |
== |
/* diferent del signe igual d'assignació */ |
- Diferent: |
!= |
|
- Menor o igual: |
<= |
|
- Major o igual: |
>= |
|
- Major: |
> |
|
- Menor: |
< |
- AND: |
&& |
/* AND sobre condicions lògiques */ |
- OR: |
|| |
|
- NOT: |
! |
Exemples:
si a és igual a b i (no és cert que b és major que c o és cert que a és diferent de 6);
if ((a==b) && (!(b>c) || (a!=6)))
- Assignació: |
= |
|
- Multiplicar i assignar: |
*= |
|
- Dividir i assignar: |
/= |
|
- Mòdul i assignar: |
%= |
|
- Restar i assignar: |
-= |
|
- Sumar i assignar: |
+= |
|
- etc. | /* qualsevol operació en què una variable */
/* apareix com a font i com a destí */ |
Exemples:
x /= 2; equival a x = x/2; x *= y+1; equival a x = x*(y+1);
- Operació AND: |
& |
/* AND bit a bit de 2 valors */ |
- Operació OR: |
| |
|
- Operació XOR: |
^ |
|
- Operació NOT: |
~ |
/* NOT bit a bit */ |
- Desplaçament a la dreta: |
>> |
/* desplaçar un cert número de bits */ |
- Desplaçament a l'esquerra: |
<< |
Exemples:
int x,y; x = ~((y & 0x001f) << 3); /* x = y AND 001f hexa, desplaçat 3 bits a l'esquerra, i tots els bits negats */ y >>= 1; /* desplaçar y un bit a la dreta (dividir per 2) */
- Operació Si <condició> Llavors Retorna <A> Sinó Retorna <B>:
<condició> ? <A> : <B>
Exemples:
x = (a>b) ? a : 3; /* si (a>b) llavors x=a ; sinó x=3 ; */
- Qualsevol expressió d'assignació entre parèntesi es converteix a la seva vegada en un operand per a una segona expressió, el valor del qual és el resultat de la primera expressió.
Exemples:
a=(b+=5); -> b=b+5; a=b; a=(c++)*2; -> a=c*2; c=c+1; a=(++c)*2; -> c=c+1; a=c*2; a=3*(b=5+c*2)-1 -> b=5+c*2; a=3*b-1; a=(b=c); -> b=c; a=b; a=(b==c); -> si (b==c) llavors a=1;sinó a=0; /* (b==c) retorna un booleà (FALS=0) (b=c) retorna el valor de b */ a=(b=(c=0)); -> a=b=c=0; -> c=0; b=0; a=0; /* sense parèntesi s'avalua de dreta a esquerra */
- En expressions on estiguin involucrades variables i constants de diferents tipus, el C converteix automàticament totes les variables de l'expressió al tipus més gran, i després opera. El resultat es converteix posteriorment al tipus de la variable resultat.
Exemples:
char c,c2; int i; float r,r2; c = 'A'; /* 'A' és una constant de tipus char; c pren per valor el número ASCII (8 bits) de la lletra "A" */ c2= c+12; /* c es converteix a enter, perquè 12 és un enter, se sumen enters, i el resultat es converteix a caràcter (16 bits -> 8 bits) */ i = c2; /* el valor numèric 8 bits de c2 es passa a 16 bits cap a i */ r = i*c; /* c es converteix a enter i el resultat de la multiplicació es converteix a real */ c2= r/12.0; /* es divideixen dos reals i el resultat es converteix en un caràcter: enter de 8 bits (part entera del real, mòdul 256) */ r = 5/9; /* es fa la divisió entera (5 i 9 són enters), i el resultat es converteix en real (r = 0.0) */ r2= 5.0/9.0; /* es fa la divisió real (5.0 i 9.0 són reals), i el resultat es deixa com a real (r2 = 0.5555555555556) */
- Per practicar amb els operadors, proveu d'acabar el següent programa en C (escriure una única expressió per cada línia de comentari que comenci per '?'; per convertir la pregunta en un comentari, substituir l'interrogant per '/'). El procés consisteix en obrir un editor (NE.COM, per exemple), modificar el fitxer de text OPERADOR.C, compilar, linkar, i executar des de l'intèrpret de comandes del DOS (si no hi han errors de compilació!).
#include <stdio.h> void main(void) { char c; /*definició de variables */ unsigned char c2; int i,j; float real; double real_gran; ?* assignar el caràcter 'Z' sobre la variable i */ ?* assignar i*2 (desplaçament) a c i c2 simultàniament */ ?* assignar CERT a j si i és més gran o igual que 90, altrament assignar FALS */ ?* autoincrementar j, i assignar 100 dividit pel nou valor de j +4 a real (divisió entera) */ ?* multiplicar real per 2, i assignar el seu nou valor dividit per 5 a real_gran (divisió real) */ /* comandes d'impressió */ printf("i: %d\n",i); printf("c: %c (%d)\n",c,c); printf("c2: %c (%d)\n",c2,c2); printf("j: %d\n",j); printf("real: %.2f\n",real); printf("real_gran: %.2f\n",real_gran); }
- A continuació s'explica com treballar amb els programes del seminari. Es suposarà que els fonts de C es troben al directori "C:\SEMINARI", i separats per subdirectoris corresponents a les 4 seccions del seminari ("\SEC1", "\SEC2", ...). Es poden editar els fitxers directament sobre el directori on es troben; després, la compilació i el linkatge es farà de la següent forma (suposant que els programes implicats són accessibles amb el PATH que es tingui definit:
C: ;canviar directori de C: per defecte C:\>CD SEMINARI\SEC1 ;al directori on es troba OPERADOR.C C:\SEMINARI\SEC1>NE OPERADOR.C ;editar... C:\SEMINARI\SEC1>TCC OPERADOR.C ;compilar i linkar... C:\SEMINARI\SEC1>OPERADOR ;provar programa
- El resultat de l'execució ha de ser el següent llistat per pantalla:
i: 90 ; valor enter de la lletra 'Z' (segons taula ASCII) c: -| (-76) ; caràcter ASCII 180 <- i * 2 (rep. 8 bits Ca2 : -76) c2: -| (180) ; caràcter ASCII 180 <- i * 2 (rep. 8 bits natural : 180) j: 2 ; 1 <- CERT quan (i >= 90), autoincrementat real: 32.00 ; 100 / (2+4) divisió entera, multiplicat per 2 real_gran: 6.40 ; 32 / 5 divisió real