| - 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