Начала программирования на языке Си, страница 7

k=++i         //дает следующий результат k=4

k=i++;      // i=4,  k=3

k=--i;        // i=2,  k=2

k=i--;        // i=2,  k=3;

i=j=k--      // i=0,  j=0,  k=-1

Выражения x+++b или z---d трактуются как (x++)+b и (z--)-d.

5.2. Отношения и логические выражения

Отношение определяется как пара арифметических выражений, соединенных (разделенных) знаком операции отношения:

= = равно;    != не равно;

< меньше чем,     > больше чем;

<= меньше или равно,     >= больше или равно.

Примеры:

a-b>8;   c!=d;   (x-4)*z>=0;   x/(y-z)==12.

Принято считать, что отношение имеет ненулевое значение, т.е. 1, если оно истинно и 0, если ложно, т.е. значение отношения 101/9>=10 будет 1, а 101*9<0 будет 0.

Логических операций в Си три:

! – отрицание, т.е. логическое НЕ;

&& - конъюнкция, т.е. логическое И;

|| - дизъюнкция, т.е. логическое ИЛИ.

Пример:

Условие того, что сумма длин двух сторон треугольника всегда больше длины третьей стороны может быть записано следующим образом:

a+b>c && b+c>a && c+a>b.

5.3. Присваивание

Присваивание предназначено для изменения значений переменных. Символ “=” в языке Си обозначает бинарную операцию присваивания, у которой в выражении должно быть два операнда: левый – обычно переменная и правый обычно выражение. Если x – имя переменной, то x=5/1+7/2 – выражение со значением 12.3, которое присваивается переменной x.

Может быть также организована операция множественного присваивания:

c=x=d=1.3+8.5;

Здесь значение 9.8 присваивается переменной d, затем x как “d=1.3+8.5”, затем как “x=d”.

В языке Си предусмотрен набор составных операций присваивания, имеющих вид:

имя_переменнойОП=выражение;

здесь ОП=одна из операций: *, /, %, +, -, &, ^, |, <<, >>, причем в ОП= сначала выполняется ОП, а затем “=”. Например, x*=2; означает x=x*2;  z+=4; - z=z+4;  k/=x+4*z  -  k=k/(x+4*z).

Не следует путать операцию присваивания a=b и операцию сравнения a= =b. В первом случае в ячейки памяти с именем а помещается содержимое ячеек памяти с именем b. Во втором случае содержимое ячеек памяти с именем а сравнивается с содержимым ячеек памяти с именем  b.

5.4. Преобразование типов данных

Очень часто в операциях принимают участие данные разных типов. Например, пусть int i; double r; float f1. Какого типа будет данное s=r*f1/i, если тип s не был объявлен заранее? В Си автоматические преобразования типов данных при выполнении смешанных операций производятся в соответствии с иерархией преобразования. То есть, в смешанных операциях, значения разных типов приводятся к тому типу данных, который имеет больший приоритет в иерархии:

double

float

long

int

short

Пример:

int ivalue1=3;

int ivalue2=4;

float fvalue1=7.0;

fresult=fvalue1+ivalue1/ivalue2.

Каким будет тип данных fresult?

ivalue1/ivalue2 не является смешанной операцией, деление двух целых чисел дает в результате целое число, в нашем случае это будет ноль, т.е. переменной fresult будет присвоено значение 7.0.

Если переменную ivalue2 описать как float, то операция ivalue1/ivalue2 даст в результате 0,75, а fresult примет значение 7.75. Следует также отметить, что тип переменной, стоящей слева от оператора присваивания определяет тип результата вычислений.

Пример:

int iresult; double fx,fy;

fx=7.0; fy=2.0;

iresult=4/0+fx/fy.

Так как iresult целое, то результат будет равен iresult=7 (дробная часть при делении fx/fy в этом случае отбрасывается).

Если в процессе выполнения программы требуется изменить тип переменной, то это можно сделать с помощью явного преобразования типов, применив, оператор приведения типа, т.е. перед переменной перед ее именем нужно ввести в круглых скобках название соответствующего типа данных. Например, следующие преобразования типов из предыдущего примера дадут одинаковый результат при вычислениях:

fresult=fvalue+(float)ivalue1/ivalue2;

fresult=fvalue+ivalue1/(float)ivalue2;

fresult=fvalue+(float)ivalue1/(float)ivalue2.