Wyrażenia arytmetyczne Do budowania wyrażeń w języku C używa się operatorów jednoargumentowych oraz dwuargumentowych. Podstawowy operator jednoargumentowy to operator zmiany znaku (-), który jest prawostronnie łączny i ma większy priorytet niż każdy z operatorów dwuargumentowych. Operatory dwuargumentowe są lewostronnie łączne. Oto lista podstawowych operatorów w kolejności malejących priorytetów (operatory z jednej linii mają ten sam priorytet) : * - mnożenie / - dzielenie % - reszta z dzielenia + - dodawanie - - odejmowanie Operator przypisania (=) jest prawostronnie łączny. Instrukcja przypisania: i=k/n*m; oznacza, że zmienna i przyjmie wartość wyrażenia:. Natomiast instrukcja: i=k/(n*m); przypisuje zmiennej i wartość wyrażenia:. Oto przykład programu, który wczytuje wartości dwóch zmiennych typu integer a i b i zamienia ich wartości. Wykorzystano instrukcję przypisania i dodatkową zmienną c. int main() //zamiana wartosci dwoch liczb c=a; a=b; b=c; printf("\n\ta=%d\n\tb=%d\n",a,b); Typy zmiennych mają decydujący wpływ na typ wartości wyrażenia. Jeśli oba argumenty są tego samego typu wartość wyrażenia jest tego samego typu. Ilustruje to poniższy przykład:
int main() //dzielenie calkowite c=a/b; printf("\n\ta=%d\n\tb=%d\n\tc = a/b = %d/%d = %d\n",a,b,a,b,c); A oto przykładowe wywołanie programu: a= a= c = a/b = /3 = 0 Ponieważ oba argumenty są typu całkowitego wynik dzielenia jest całkowity i wynosi 0. Nie ma tu miejsce zaokrąglenie liczby, lecz odcięcie części ułamkowej. Jeśli do zmiennej typu double podstawimy wartość dzielenia dwóch liczb integer dzielenie będzie wykonane w sposób całkowity (a więc bez części ułamkowej), a następnie wynik zostanie podstawiony do zmiennej zmiennoprzecinkowej (część ułamkowa zostanie wypełniona zerami). Jeśli przynajmniej jeden argument jest typu float lub double, wynik dzielenia jest również tego typu. Do zmiany typu argumentu służy jednoargumentowy, prawostronnie łączny operator: (typ) zmienna Operator ten został użyty w kolejnym przykładzie w celu uzyskania spodziewanego wyniku dzielenia: int main() //dzielenie calkowite i nie tylko double d; c=a/b; printf("\n\ta=%d\n\tb=%d\n\tc = a/b = %d/%d = %d\n\n", a,b,a,b,c); d=a/b; printf("\n\ta=%d\n\tb=%d\n\td = a/b = %d/%d = %lf\n\n", a,b,a,b,d); d=(double)a/b; printf("\n\ta=%d\n\tb=%d\n\td = a/b = %d/%d = %lf\n\n", a,b,a,b,d); printf("\n\td = %5.3lf\n\n\n",d); A oto przykładowy wynik programu:
a= a= c = a/b = /3 = 0 a= d = a/b = /3 = 0.000000 a= d = a/b = /3 = 0.666667 d=0.667 Zasady dotyczące wyniku działania operatorów arytmetycznych w zależności od typów argumentów dotyczą również stałych liczbowych użytych w programie. Liczba zapisana bez kropki dziesiętnej jest liczbą całkowitą typu int, stała zapisana z kropką dziesiętną przyjmuje typ double. Dlatego wynikiem działania: 1/ jest 0, natomiast 1./ daje w wyniku liczbę 0.5. Do obliczania wartości wyrażeń często potrzebne są funkcje matematyczne zawarte w bibliotece. Aby skorzystać z tych funkcji należy do programu dołączyć plik nagłówkowy zawierający ich deklaracje za pomocą polecenia preprocesora: #include <math.h> oraz dołączyć bibliotekę matematyczną (w systemie linu kompilacja poleceniem: gcc -lm program.c o program). Należy zwrócić uwagę na typ funkcji oraz typ argumentów. Do najpopularniejszych funkcji należą: double ep(double ) double log(double ) e ln
double log10(double ) double pow(double, double y) double sqrt(double ) double sin(double ) double cos(double ) double tan(double ) double fabs(double ) int abs(int ) log y sin cos tg Zapis przykładowych wyrażeń matematycznych w języku C: double,y,z,m; z=(ep(*pow(,m))+log()*sqrt(*y))/(*sin()*cos(*)); Należy zwrócić uwagę na to, że cały mianownik musi być ujęty w nawiasy. double,y; int k,l; tg y 1 (1 5 e 1 )(cos k l 6) y=(tan(*/(1+*))*ep((1+*)/(*))+(double)k/l)/((1++pow(,5./.)*(cos()*cos()+6))); Do uzyskania potęgi 5/ wykorzystano funkcję pow, której drugim argumentem jest 5./. Dziesiętna kropka przy liczbie 5 lub jest niezbędna, w przeciwnym wypadku podniesione by zostało do potęgi, zamiast.5. Do uzyskania rzeczywistego wyniku z dzielenia dwóch całkowitych zmiennych k i l zastosowano operator rzutowania (double). 3 a b z 3 1 ( y)sin
double a,b,,y,z; z=(a*a+pow(b,1./3.))/((+y)*sin()) + fabs(3*-1);