Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Си.doc
Скачиваний:
3
Добавлен:
15.11.2019
Размер:
2.72 Mб
Скачать

Примеры записи выражений целого типа:

sqrt(a)*b*b

5*pow(x,3) 5*x*x*x

a*b/c + c/(a*b)

cos(x*x*x)*cos(x*x*x)

exp(log(1.0+x)/3.0) pow((1.0+x),1.0/3.0)

Внимание! Ошибочная запись pow((1.0+x),1/3)

Примеры вычислений выражений целого типа:

(5&3) + (5|3)= 8

(3>5)||(4%2)&&(4/2) = 0

(('a' - 32)=='A') + !(3>5) + (5||3) = 3

(5&&3) + (5||3) +!5 = 2

((5>3)==(5!=3)) + !('A'>'B') + ('A'==65) = 3

(!(2%3)||(2%3)) + (!(2/3)&&(2/3)) + !((3>5)||(5>2)) = 1

8/3%2 + !('C' - 'A' == 3%5) - ceil(pow(0.5,2)) = 0

Выражения вещественного типа

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

К арифметическим операциям относятся:

+ сложение 3.2 + 2.5 = 5.7

- вычитания 5.8 – 2.5 = 3.3

* умножение 3.5 * 2.0 = 7.0

/ деление 5.5 / 2.0 = 2.25

Логические операции и операции сравнения совпадают с соответствующими операциями для выражений целого типа.

Внимание! Не рекомендуется использовать операцию чистого равенства == для сравнения вещественных чисел – она, как правило, дает значение ложь (0).

Побитовые операции над операндами вещественного типа не определены.

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

операнды типов char и short – к операндам типа int,

если хотя бы один из операндов имеет тип double, то и другие преобразуются в операнды типа double, и результат будет иметь тоже тип double,

если хотя бы один из операндов имеет тип long, то и другие преобразуются в операнды типа long, и результат будет иметь тоже тип long.

Примеры записи выражений вещественного типа

2.5 + 0.97*b*b

0.2e-4*x – 5.0e-12*y

Примеры вычислений выражений вещественного типа:

ceil(log(1.0)) + ceil(exp(0.0))- round(pow(2.0,0)) = 0

floor(fmod(pow(1.6,2),pow(2.0,1))*10) - ceil(pow(1.41,2))=3

ceil(sqrt(2.0)) + floor(sqrt('D'-'A')) - (3|4) = -4

ceil(sqrt(10.0)) - floor(sqrt(3.0)) - 3%5 = 0

Операторы присваивания

Операторы присваивания служат для вычисления значений выражений и присваивания вычисленных значений переменным.

Оператор присваивания имеет вид:

x = s;

где x – имя переменной,

s – выражение того же типа,

= - знак присваивания.

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

y = y + 5;

Выполняя его, компьютер возьмет старое значение переменной y и увеличит его на 5, после чего полученное новое значение этой переменной снова запишет в отведенную для нее ячейку памяти.

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

10.5 = x;

a + b = y + 5.2;

В отличие от Паскаля, присваивание в Си может быть организовано несколькими способами:

как оператор присваивания:

a = 5;

как оператор-выражение:

a++;

как операция, встречающаяся в выражении несколько раз, при этом операции присваивания выполняются справа налево:

a = b = c = 5;

как операция, если стоит внутри других операций:

a = (b = 1) + 4;

Сначала переменной b будет присвоено значение 1, а затем к результату, полученному в скобках, будет прибавлено 4..

a = (b = 1, c = 2) + 4;

В этом случае сначала выполняются обе операции присваивания в скобках (перечисляются через запятые). Результат операций в скобках равен результату последней операции в них, то есть 2. После этого выполняются остальные операции в выражении, в данном случае операция сложения. Таким образом, одним оператором присваивания будут присвоены значения сразу трем переменным:

b = 1, c = 2, a = 6

Операции присваивания, изменяющие старые значения переменных, реализуются в Си объединенными арифметическими или побитовыми операциями присваивания:

исходный оператор объединенный оператор

a = a + 5; a+=5;

a = a – 3; a-=3;

a = a * 4; a*=4;

a = a / 6; a/=6;

a = a % 2; a%=2;

a = a + b / c; a+=b/c;

a = a & 3; a&=3;

a = a | 2; a|=2;

a = a * b / c; a*=b/c;

a = a * (b + c); a*=b + c;

Эти операции, как и сама операция присваивания, имеют самый низкий приоритет и выполняются в выражениях последними справа налево, поэтому, например, замена

a = a / b *c; на a/=b * c;

будет неверна – получаются различные выражения.

В операторах присваивания могут использоваться операции инкремента ++ и декремента --. Знаки инкремента и декремента могут стоять в выражениях как перед переменной (префиксная запись), так и после нее (постфиксная запись). При этом выражения будут вычисляться по-разному:

при префиксной записи (знак перед переменной) сначала изменяется значение этой переменной, а затем выполняются другие операции, и последней – операция присваивания:

a = 4;

b = ++a; a=5, b=5

c = ++b/2; b=6, c=3

d = ++a/2; a=6, d=3

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

a = 4;

b = a++; b=4, a=5

c = b++/2; c=2, b=5

d = a++/2; d=2, a=6

В Си приветствуется присваивание начальных значений переменным при их описании – инициализация переменных:

int i=5;

float x=3.1415;

char c=’A’;

Инициализировать переменные можно и выражениями, операндами которых являются константы:

int k=117*16;

float x= 3.1415*2.0e-3;

Если значения переменных целого или вещественного типов явно не заданы при их описании, то они автоматически инициализируются нулями.