- •Основные характеристики алгоритмического языка Си
- •Идентификаторы
- •Вопрос 2
- •Константы
- •Целый тип (int)
- •Символьный тип (char)
- •Инициализация переменных
- •Определение именованных констант
- •Унарные операции
- •Бинарные операции
- •Преобразование типов
- •Внимание!
- •Оператор принятия решений switch
- •Оператор цикла while
- •Оператор цикла do/while
- •Оператор continue
- •Оператор goto
- •Указатели
- •Int *a. B, *c; описываются два указателя на целое с именами а и с, а также целая переменная b.
- •Инициализация указателей
- •Массивы
- •Внимание
- •Связь массива с указателем.
- •Многомерные массивы.
- •Функции
- •Объявление и определение функций
- •Локальные и глобальные переменные.
- •Класс памяти
- •Параметры функции
- •Передача массивов в функции
Унарные операции
& операция получения адреса операнда
&c_Symb - адрес размещения в памяти значения переменной c_Symb.
* операция обращения по адресу (называют еще операцией разыменования (доступ по адресу к значению того объекта, на который указывает операнд).
- унарный минус (изменяет знак арифметического операнда).
+ унарный плюс (введен для симметрии с унарным минусом).
~ побитовое отрицание 0001 1100 à 1110 0011
! логическое отрицание 0 à 1, не 0 à 0.
++ увеличение на единицу (инкремент или автоувеличение), существует две формы:
префиксная - увеличение до использования
...
int result, arg=2;
result = ++arg;
после выполнения result примет значение 3.
постфиксная - увеличение после использования
...
int result, arg=2;
result = arg++;
после выполнения result примет значение 2.
-- уменьшение на единицу (декремент или автоуменьшение), также префиксная и постфиксная формы.
sizeof операция вычисления размера операнда (в байтах)
sizeof(char) = 1
sizeof(long) = 4
short Count; --- sizeof(Count) = 2
Бинарные операции
Делятся на следующие группы:
аддитивные и мультипликативные
сдвигов
поразрядные
операции отношений
логические
выбора компонента сложного объекта
операция "запятая"
скобки в качестве операций
Аддитивные и мультипликативные.
+ |
бинарный плюс - сложение арифметических операндов или сложение указателя с целым |
- |
бинарный минус - вычитание арифметических операндов или вычитание указателей |
* |
умножение операндов арифметического типа |
/ |
деление операндов арифметического типа. При целочисленных операндах абсолютное значение результата округляется до целого. 20/3 = 6 и (-20)/3 = -6 |
% |
получение остатка от деления целочисленных операндов (деление по модулю). Знак остатка равен знаку делимого. Например: 14%3 = 2 и (-14)%3 = -2 |
Один нюанс, который вы должны запомнить.
float res;
res = 5/4;
Результат: res = 1.
Для того, чтобы посчитать "правильно", этот фрагмент программы должен быть
float res;
res = 5./4.;
Результат: res = 1.25.
Операции сдвига. Эти операции определены только для целочисленных операндов.
<< сдвиг влево битового представления левого операнда на число позиций равное значению правого операнда.
short res, Value = 12;
res = Value << 5;
12=0000 0000 0000 1100 - после операции 0000 0001 1000 0000 =0x180=256+128 = 384
12 * 25 = 12 * 32 = 384
>> сдвиг вправо битового представления левого операнда на число позиций равное значению правого операнда.
short res, Value = 1120;
res = Value >> 5;
1120 = 1024 + 96 = 1024 + 64 + 32 = 210 + 26 + 25 = 0000 0100 0110 0000
- после операции 0000 0000 0010 0011 =0x23=32+3 = 35
1120 / 25 = 1120 / 32 = 35
Поразрядные операции.
Выполняются над битовыми представлениями значений целочисленных операндов
& |
поразрядная конъюнкция (И) |
| |
поразрядная дизъюнкция (ИЛИ) |
^ |
поразрядное исключающее ИЛИ |
Операция конъюнкция 0&0 = 0 1&0 = 0 0&1 = 0 1&1 = 1
Операция дизъюнкция 0&0 = 0 1&0 = 1 0&1 = 1 1&1 = 1
Операция поразрядное исключающее ИЛИ 0&0 = 0 1&0 = 1 0&1 = 1 1&1 = 0
Пример.
0000 0001 1100 1110
0110 0111 0110 1010
--------------------------
0000 0001 0100 1010 (&)
0110 0111 1110 1110 (|)
0110 0110 1010 0100 (^)
Операции отношений (сравнения).
< |
меньше, чем |
> |
больше, чем |
<= |
меньше или равно, чем |
>= |
больше или равно, чем |
== |
Равно |
!= |
не равно |
Операнды в этих операциях должны быть арифметического типа или указателями.
Результат операции целочисленный: 0 (ложь) или 1 (истина).
Логические операции.
&& конъюнкция (И) арифметических операндов или отношений
|| дизъюнкция (ИЛИ) арифметических операндов или отношений
Результат 0 (ложь) или 1 (истина).
Примеры отношений и логических операций:
4 < 9 → 1
3 == 5 → 0
3 != 5 || 3==5 → 1
(3+4>5) && (3+5>4) && (4+5>3) → 1
Операции присваивания.
Один из основных операторов языка С - оператор присваивания. В качестве его левого операнда может использоваться только модифицируемое именующее выражение, т.е. ссылка на некоторую именованную область памяти, значение которой доступно изменениям.
Существует одна простая операция присваивания и ряд составных.
Простое присваивание -
А = B*2; - присвоить переменной А результат вычисления выражения B*2.
Все составные операции присваивания представляют собой сокращенную запись простого присваивания для случая, который может быть описан как
X = XÅY; - тоже в записи составного присваивания X Å=Y;
В качестве символа Å могут быть использованы знаки операций: + - * / % << >> & | ^
Примеры. f += 5; d -=f*2; con ^=0xff71;
Операции выбора компонентов структурированного объекта.
Существует две операции (. и ->) которые мы будем рассматривать позже, вместе с определением самих структурированных объектов.
Запятая в качестве операции.
Несколько выражений, разделенных запятыми, вычисляются последовательно слева направо. В качестве результата сохраняются тип и значение самого правого выражения.
int x,y; y = (x=3, 3*x); (после операции х=3, y=9).
Скобки в качестве операций.
Круглые и квадратные скобки играют роль бинарных операций при вызове функций и индексировании элементов массивов.
Круглые скобки обязательны в обращении к функции:
<имя функции> ( <список аргументов> )
где операндами служат <имя функции> и <список аргументов>.
Квадратные скобки используются в выражении
<имя массива> [<индекс>]
здесь операнды <имя массива> и <индекс>
Условная операция (?:). Эта операция тернарная, то есть имеет три операнда. Ее формат:
операнд_1 ? операнд_2 : операнд_3
Первый операнд может иметь арифметический тип или быть указателем. Он оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю — как true). Если результат вычисления операнда 1 равен true, то результатом условной операции будет значение второго операнда, иначе — третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращенной формой условного оператора i f (он рассмотрен на с. 40).
#include <stdio h>
int main(){
int a = 11, b = 4, max;
max = (b > a)? b :a;
printf( "Наибольшее число. %d", max);
return 0; }
Результат работы программы:
Наибольшее число 11
Другой пример применения условной операции. Требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает п, а иначе принимала значение 1:
i = (i < n) ? i + 1: 1,
Приоритет операций. Порядок вычисления выражений.
Сейчас мы рассмотрели весь набор операций языка С. И остался не решенным такой вопрос: в какой последовательности применяются записанные в выражении операции?
Что будет результатом вычисления 4 + 3 * 5 ? 35 или 19?
Очевидно, предполагая определение языка С как "удобного" мы вправе ожидать получения 19. Однако откуда это следует?
Да, действительно результат будет 19 и следует это из системы приоритетов операций языка С. Каждой операции языка приписан определенный приоритет выполнения (ранг) и операции выполняются в порядке увеличения ранга: в первую очередь операции с приоритетом 1, потом 2 и т.д.
Если операций одного ранга в выражении несколько, то они выполняются в соответствии с правилом ассоцмативности либо слева направо (à), либо справа налево (ß). Если какой-либо знак операции появляется в таблице дважды (например *), то его первое вхождение (меньший ранг) соответствует унарной операции.
Составим таблицу приоритетов операций.
Ранг |
Операции |
1 |
( ) [ ] -> . |
2 |
! ~ + - ++ -- & * (тип) sizeof |
3 |
* / % (мультипликативные бинарные) |
4 |
+ - (аддитивные бинарные) |
5 |
<< >> (операции поразрядного сдвига) |
6 |
< <= >= > (отношения) |
7 |
== != (отношения) |
8 |
& ( поразрядная конъюнкция "И") |
9 |
^ ( поразрядное исключающее "ИЛИ") |
10 |
| ( поразрядная дизъюнкция "ИЛИ") |
11 |
&& ( логическая операция "И") |
12 |
|| ( логическая операция "ИЛИ") |
13 |
?: (операция условной трансляции) |
14 |
= += -= *= /= %= &= |= ^= <<= >>= (присвоения) |
15 |
, (операция "запятая") |
Для работы с математическими выражениями используется встроенные функции, которые находятся в стандартной библиотеке (math.h) и приведены в таблице.
Функция |
Выполняемые действия |
Abs(n) |
Возвращаемый модуль целого числа |
fabs (x) |
Возвр. модуль вещественного числа |
acos(x) asin(x) atan (x) atan 2(x) |
Arcos x Arsin x Arctg x Возвращаем arctg x/y |
cos(x) sin(x) tan(x) exp(x) log(x) log10(x) pow(x,y) sqrt(x) floor() ceil fmod(x,y) modf
|
Cos x Sin x Tag x Степень числа е Натуральный логарифм Логарифм по основанию 10 Возводит число в степень Квадратный корень из числа Округляет вниз Округляет вверх Остаток от деления х на у разбивает число на целую и дробную часть |