Cea mai evidenta "libertate" se regaseste la tipul caracter
(char). Tipul caracater este de fapt un tip întreg
reprezentat pe un octet (asemanator cu tipul byte din Pascal). Astfel,
secventa urmatoare de cod este perfect legala, acest tip de
"artificii" de programare fiind des întâlnite:
int i; char c; c='A'; i=c; printf("codul ASCII al caracterului %c este %d\n",i,i); i='A'+1; printf("si urmatorul caracter este %c cu codul %d\n",i,i);
Un operator foarte folosit în C este operatorul de incrementare ++. Astfel, secventele:
i++;
sau
++i;
sunt echivalente cu:
i=i+1;.
Diferenta între cele doua forme de scriere a operatorului de incrementare (format postfix si format prefix) consta în modul în care
se face incrementarea lui i: dupa sau înainte de
folosirea valorii variabilei
int i,j,k; i=5; k=i++; /* dupa aceasta instructiune, k va avea valoarea 5, iar i 6; atribuirea are loc inainte de incrementare*/ j=++i; /* dupa aceasta instructiune, i va lua valoarea 7, iar j tot 7 atribuirea are loc dupa incrementare*/
În mod analog se comporta si operatorul de decrementare .
Un alt mod de a compune operatorii este prin folosirea operatorului = dupa un operator aritmetic (+ - * / %) sau un operator la nivel de bit (vezi capitolul 3).
De exemplu:
a+=3;
înseamna:
a=a+3;.
Limbajul C permite si atribuiri multiple, de tipul:
a=b=c=2;
În asemenea atribuiri, evaluarea se face de la dreapta spre stânga.
Dupa cum s-a aratat în paragrafele anterioare, în C nu exista tipul boolean, valorile de adevar true-false fiind reprezentate de 0 si 1, astfel ca rezultatul unei comparatii poate fi folosit în cadrul unei atribuiri:
a=b3;
Aceasta are ca efect atribuirea valorii 1 sau 0 (functie de b mai mare ca 3 sau nu) variabilei a.
O alta particularitate a limbajului C este posibilitatea de a initializa variabile în momentul definitiei. Secventa:
int i=5;
defineste variabila i ca fiind de tip întreg, având valoarea initiala 5.
Un operator specific C-ului este operatorul de secventiere , (reprezentat prin virgula). Astfel:
i=(j++, ab++);
are ca efect evaluarea expresiei j++, dupa care se evalueaza expresia ab++, rezultatul acestei ultime evaluari fiind cel atribuit lui i.
Dupa cum s-a aratat în exemplele anterioare, în C se efectueaza automat conversia dintre tipuri în cazul atribuirii. La fel se întâmpla si în cazul transmiterii de parametri in functii.
Programatorul poate controla explicit aceste conversii folosind operatorul de casting (). Între paranteze se scrie tipul la care se doreste sa se faca conversia, iar parantezele se plaseaza înaintea variabilei sau expresiei de convertit. Un exemplu este prezentat în secventa:
float b; b=3/(float)2;Folosind operatorul de casting, b va avea valoarea 1.5. În absenta acestui operator, la împartirea lui 3 la 2, ambele valori fiind întregi, rezultatul ar fi fost trunchiat la 1, dupa care ar fi fost atribuit variabilei b.
Toti operatorii prezentati pâna acum au fost unari sau binari (cu unul sau doi operanzi). În C exista si un operator ternar (cu trei operanzi). Acesta este operatorul conditional ? :, echivalent cu instructiunea if. Astfel, secventa:
x=(a<b)?a:b;este echivalenta cu:
if (a<b) x=a; else x=b;