+ сложение
- вычитание
* умножение
/ деление
% деление по модулю (остаток от деления)
Примеры арифметических выражений :
X = A + B
W = (D*10+C)/(K+1)
A = sin(b)+10
X = 5 + 3 * 2 Выражение X = 5 + 3 * 2 включает три операции * + и = (операции перечислены в соответствии с их приоритетами). Сначала вычисляется выражение в правой части (3*2)+5, а затем результат присваивается переменной в левой части ( X=11). Оператор присваивания. Для работы с переменными, нужно научиться заносить в них различные значения. Как это делается при создании переменных с помощью знака «=» (инициализация), мы уже знаем. Но часто в уже созданную переменную нужно занести её значение, этом случае говорят записать значение. Пример:
int p1, p2, p3;
p1=5; // записать в переменную p1 константу 5
p2=p1; // записать в переменную p2 значение из p1
p3 = p1+10; // записать в переменную p3 результат вычислений В последнем примере сначала вычисляется значение выражение p1+10, а затем результат присваивается операнду p3.
Следует отметить, что левый операнд оператора присваивания всегда должен быть адресным выражением, то есть объектом, размещенным в памяти компьютера. Примером адресного выражения является имя переменной. Примером не адресного выражения является, выражение a+b, а также константы, которые могут стоять только справа от символа присваивания. Примеры неправильного использования оператора присваивания :
5 = p1;
p1 + p2 = p3; Язык Си позволяет выполнять множественное присваивание, например можно написать такую конструкцию: var = p3 = 7;
Операторы присваивания обрабатываются справа налево, читать эту строку следует так: "записать в p3 значение 7, затем записать в var значение из p3".
Существует так называемая комбинированная операция присваивания, которая позволяет вместо выражения x =x+a, записать x += a
Вместо операции «+» может стоять любая их следующих бинарных операций:
+ - * / % Примеры :
a += 2; // эквивалентно a = a+2
s *= a ; // эквивалентно s = s*a Преобразование типов в выражениях
Язык Си допускает выражения с операндами различных типов. Например, можно делить переменную типа double на константу типа int, прибавлять константу типа int к переменной типа char и тому подобное. Если выражение имеет операнды различных типов, более низкий тип всегда преобразуется к более высокому. Один тип ниже другого, если он занимает меньше памяти, например, целый тип ниже вещественного.
Пример:
double x,y;
char ch;
long in;
int i;
....
y = x*(i+ch/in); В выражении y = x*(i+ch/in) преобразования типов данных будут выполняться в следующей последовательности:
Операнд ch преобразуется к типу long ( к большему операнду выражения ch/in), по этой же причине i преобразуется к long Результат операции, заключенной в круглые скобки будет иметь тип long. Затем он преобразуется к типу double , к большему операнду выражения x*(i+ch/in) Результат всего выражения будет иметь тип double
До сих пор преобразование типов выполнялось неявно, то есть по определенным правилам, заданным языком Си и реализованным в компиляторе. Но можно и явно указать какое преобразование нужно выполнить. Явное приведение значения одного типа к другому выполняется с помощью специальной операции. Допускается даже преобразование к типу данных с меньшим объемом памяти, но следует помнить, что в этом случае будет потеряна часть информации. Формат операции приведения типа: (имя_типа) операнд
Операндом может быть :
Переменная Константа Выражение в круглых скобках
Примеры явного преобразования переменных:
…
int a,b,c;
double x;
/* результат правой части выражения – целое, поэтому результат будет округлен до ближайшего целого (потеря дробной части числа)*/
x=(a+b)/c;
/* Следующие действия позволяют избежать потери результата */
x = ( (double)a + b) / c;
x = (double)(a+b) / c;
x = (a+b) / (double)c; Логические операции и операции отношения Наряду с арифметическими операциями, которые используются для всевозможных вычислений, в языках программирования есть и логические операции, которые используются для проверки условий. Логические операции называют операциями отношения, значение переменной или константы они сравнивают с литералом, или со значением другой переменной или константы.
Результат сравнения имеет логический тип (bool) :
true (истина или 1) либо false (ложь или 0).
Рассмотрим подробнее операции отношения, к ним относятся:
> больше;
< меньше;
>= больше или равно;
<= меньше или равно;
= = равно (проверка на равенство)
!= не равно. Операции отношения по рангу младше арифметических операций, так что выражения типа :
i < lim+3 понимаются как i < (lim+3) Приведем примеры проверки простых логических условий : (i>7) // результат 1(true,да) если i больше 7, и 0 (false,нет) – в противном случае
(i==j) //результат 1 если i равно j
(x+1 != k)//результат 1 если x+1 не равно k Чаще всего ошибки совершают при проверке на равенство, обратите внимание, что в этом случае необходимо ставить два знака «=»,
выражение подобное if (i=j) неверно!
но компилятор подобные ошибки не диагностирует , так как интерпретирует данное выражение следующим образом : if ((i=j)!=0), то есть сначала заносит значение j в переменную i, а затем сравнивает результат с нулем. Если нам необходимо проверить сложное условие, то есть объединить несколько простых логических выражений в единое сложное выражение, то понадобятся логические связки, так называемые логические операции. К логическим операциям относятся:
&& логическое И (конъюнкция), бинарная операция;
|| логическое ИЛИ (дизъюнкция), бинарная операция.
! логическое НЕ (отрицание), унарная операция; Так же как и у операций отношения, у логических операций результат логический (бинарный), либо 1 (true) либо 0 (false)
Примеры применения логических связок (сложных условий) :
Если а <b, то :
Чтобы записать логическое условие, соответствующее следующей математической записи a<i<b, потребуется логическая связка && :
( i>a && i< b) Чтобы записать логическое условие, соответствующее следующей математической записи a>i>b, потребуется логическая связка || :
( i<a || i> b) Условный оператор if Когда линейную часть программы необходимо разделить на две или более ветви (альтернативы) используют операторы условных и безусловных переходов. Это структурные операторы языка, которые позволяют менять порядок выполнения программы в зависимости от некоторых условий. Ветвление осуществляется путем анализа некоторого логического выражения, задающего условие выбора альтернативы.
Оператор if позволяет разветвить вычислительный процесс на два варианта в зависимости от значения некоторого условия.
Имеется две формы условного оператора:
Полная схема выполнения : if (выражение) оператор1 else оператор2; Сокращенная схема выполнения : if (выражение) оператор1;
Выполнение оператора if начинается с вычисления выражения в скобках.
Далее действует следующая схема:
если (выражение) имеет значение true (отлично от 0), то выполняется оператор1 если (выражение) имеет значение false (равно 0), то выполняется оператор2 если (выражение) имеет значение false и отсутствует конструкция со словом else, то выполнение оператора if завершается.
Рис 5 Полная блок-схема оператора if
Рис 6 Сокращенная блок-схема оператора if
Примеры:
if (a > b) c = a - b; // выполняется, если a больше b
else c = b - a; // выполняется, если a меньше b
… …
if (i < j) i++;
else {j = i - 3; i ++;} // блок операторов выполняется, если i больше j Оператор выбора switch (селективный оператор). Если в программе используются больше трех возможных вариантов, то следует использовать оператор switch Его часто называют селективным оператором, переключателем или оператором выбора. Оператор switch передает управление одному из нескольких помеченных специальными метками операторов в зависимости от значения целочисленного выражения. Специальные метки начинаются с ключевого слова case и являются целочисленными константами.
Оператор имеет следующий вид:
switch (целое_выражение )
{ [объявления]
[case константное_выражение1:]
[операторы группы_1]
[case константное_выражение2: ]
[операторы группы_2] [case константное_выражение n:]
[операторы группы_n]
[default:] [операторы default]
} Результат выражения в круглых скобках должен быть целым. Оператор switch рассматривает значение выражения не как логический результат true либо false, а как "шаблон" для выбора подходящего варианта из заданного списка.
Схема выполнения оператора switch:
Вычисляется выражение в круглых скобках (назовем его селектором). Значение селектора последовательно сравнивается с константными выражениями, записанными после ключевого слова case (case-метка), если селектор и case-метка равны, то управление передается оператору, помеченному данной меткой Если селектор не совпадает ни с одной меткой, то управление передается на оператор, помеченный словом default. Если default отсутствует, то управление передается следующему за switch оператору.
Рис 7. Блок-схема селективного оператора.
Пример: В качестве селектора выступает переменная x int x;
printf ("x="); scanf ("%d",&x); // ввод числа с клавиатуры
switch (x)
{case 4: printf("x равно 4\n");
break;
case 2:
case 10: printf("x равно 2 или 10");
break;
default: printf("x не равно 4, 2, 10\n");
} В примере анализируется значение переменной x, и в зависимости от результата, передается управление на одну из ветвей оператора switch. Два варианта (x=2 и x=10) объединены, если x не равен 2, 4 или 10, то выполняется ветка default.
У всех вариантов выбора, кроме case 2: наборы операторов заканчиваются ключевым словом break (у case 2: вообще нет "своих" операторов). Дело в том, что оператор switch, выбрав один из своих вариантов, не заканчивает своё выполнение автоматически, дойдя до следующего варианта - он исполняет все операторы, идущие дальше, вплоть до конца всего блока, заканчивающегося закрывающейся «фигурной скобкой». Наличие ключевого слова break принудительно заканчивает каждую альтернативу и передает управление за пределы оператора swich. Если мы уберем, например, первый break, то при х==4 увидим сначала сообщение от первого printf(), а затем и от второго. Тернарная операция ветвления. Тернарная операция имеет три операнда, её форма :
выражение1 ? выражение2 : выражение3 Последовательность действий следующая:
выражение1 сравнивается с нулем, если выражение1 не равно нулю, то вычисляется выражение2 и его значение является результатом операции. если выражение1 равно нулю, то вычисляется выражение3, и его значение является результатом операции.
Заметим, что вычисляется один из операндов после знака ?, но не оба.
Рис 8. Блок-схема тернарного (условного) оператора. Пример: Переменной max присваивается максимальное значение из двух переменных а и b.
max = a<=b ? b : a;
Согласно общим правилам языка Си сначала будет выполняться выражение справа от знака присваивания, то есть тернарный оператор a<=b ? b : a Результатом этого оператора будет максимальное значение из b, a, которое и будет занесено в переменную max. Если в условной операции выражение2 и выражение 3 являются адресными выражениями, то тернарная операция может стоять слева от знака присваивания: Пример:
a< b? a:b = c*x+d; В данном примере значение выражения c*x+d присваивается меньшей из переменных a , b, если a, то вычисляется выражение a = c*x+d, иначе b = c*x+d В заключении приведем таблицу приоритетов операций языка С. Операции расположены по убыванию их приоритетов. Самый высокий приоритет имеют операции ( ) [ ] -> . , а самый низкий – операция «запятая»
Вид операции
| Знак операции
| Ассоциативность
| Первичные
| ( ) [ ] -> .
| слева направо
| Унарные
| ! - + ++ -- (type) * & sizeof
| справа налево
| Мультипликативные
| * / %
| слева направо
| Аддитивные
| + -
| слева направо
| Сдвиги
| << >>
| слева направо
| Отношения
| < <= > >= == !=
| слева направо
| Побитовые
| & ^ |
| слева направо
| Логические
| && ||
| слева направо
| Тернарная (условная)
| ? :
| справа налево
| Присваивание
| =
| справа налево
| Запятая
| ,
| слева направо
|
Примеры программирования Объявление переменных.
Повторим, что при объявлении переменной присваивается имя, тип и выделяется память.
Пример 1: Объявление 3-х переменных вещественного типа (дробные числа), необходимых для вычисления площади прямоугольника.
double a, b; // ширина и длина прямоугольника
double s; // площадь прямоугольника Пример 2: Объявление переменных, необходимых для вычисления площади кольца.
double rl, ri; // внешний радиус и радиус отверстия
double s; // площадь кольца Пример 3: Объявление переменных, необходимых для вычисления стоимости покупки, состоящей из нескольких книг, ручек и блокнота.
// переменные целого типа
int Kol_book; // количество книг
int Kol_pen; // количество ручек
// переменные вещественного типа двойной точности
double C_book; // цена одной книги
double C_pen; // цена одной ручки
double C_notebook; // цена блокнота
double Summa; // стоимость всей покупки
Присваивания и вычисления
Пример 4: Запишите инструкции, которые:
присваивают переменной summa нулевое значение,
summa = 0;
увеличивают на единицу значение переменной p.
p++;
увеличивают значение переменной x на величину dx
х = х + dx; или х += dx;
пересчет расстояния из километров в версты (одна верста — это 1066,8 м).
versta = km*1066.8;
|