- •Московский государственный социальный университет академия информатики и информационных технологий
- •Введение
- •Часть. Основы программирования на Си
- •1.1. Структура простейшей Си-программы
- •1.2. Данные в Си и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных в Си
- •1.2.3. Правила записи констант в Си
- •1.2.4. Описание переменных и именованных констант в Си.
- •1.2.5. Выражения в Си
- •1.3. Операторы преобразования данных
- •1.3.1. Общие положения
- •1.3.2. Функция форматного выводаprintf()
- •1.3.3. Функция форматного вводаscanf()
- •1.4. Разработка программ на Си
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Си.
- •1. Следование
- •2. Разветвление (развилка)
- •If (условие)
- •If (условие)
- •3. Цикл
- •1.4.4. Примеры разработки программ
- •1.5. Массивы и указатели
- •1.5.1. Понятие массива. Основные правила работы с массивами в Си
- •1.5.2. Примеры программ с массивами.
- •1.5.3. Инициализация массивов
- •1.5.4. Указатели в Си10
- •1.5.5. Связь массивов с указателями в Си
- •Часть. Функции и многофайловые программы в Си
- •2.1. Общие сведения о подпрограммах и функциях
- •2.2. Функции си
- •2.2.1. Описание функции
- •2.2.2. Обращение к функции
- •2.2.3. Место описания функции в программе
- •2.2.4. Примеры программ, использующих функции
- •2.3. Краткие сведения о препроцессоре Си
- •2.3.2.Директива макроопределения #define
- •2.3.3. Директива #include включения файлов
- •2.3.4. Директивы условной компиляции
- •2.415. Многофайловые си-программы
- •2.4.1. Структура программы на Си. Область действия переменных
- •2.4.2. Время жизни и класс памяти переменных
- •Описатели класса памяти
- •2.4.3 Понятие о файле проекта
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации на Си
- •3.1.1. Символьный тип
- •3.1.2. Работа со строками символов в Си. Строковые литералы. .
- •3.1.3. Функции и макросы для работы с символьной информацией
- •3.1.4. Примеры программ
- •3.2. Тип "структура" в Си
- •Структура
- •3.3. Файлы в Си
- •3.3.1. Общие понятия.
- •3.2.Функции Си для работы с файлами
- •3.3.3. Примеры программ, использующих файлы
- •Литература
- •Содержание
1.2.5. Выражения в Си
Приведем очевидное определение: выражение- этооперанды, соединенные знакамиопераций. В качестве операндов могут использоваться переменные, константы, результаты обращения к функциям5и выражения, заключенные в круглые скобки. Способы описания переменных и констант мы рассмотрели в предыдущем параграфе; заметим, что пока мы знакомы только с простыми переменными; конечно, в выражении может участвовать и элемент массива (переменная с индексом – см. п. 1.5), и поле структуры или объединения (см. п.3.2).
В таблице 3 приведены знаки операций, определенные стандартом языка Си. В первом столбце таблицы указан ранг (приоритет операций). В первую очередь выполняются операции ранга 1, во вторую - ранга 2, и т. д. Операции одного ранга выполняются последовательно, направление выполнения операций (ассоциативность) - справа налево () или слева направо () - указано в третьем столбце. Если один и тот же знак операции встречается в таблице дважды, то первое его появление (с меньшим рангом) соответствует унарной операции, а второе - бинарной.
Таблица 3. Операции Си.
Ранг |
Обозначение операции |
Название операции |
Ассоциативность |
1 |
( ) [ ] ->
. |
круглые и квадратные скобки косвенный выбор компонента структурированного объекта прямой выбор компонента структурированного объекта (см. п.3.2) |
|
2 |
!
+ - ++ -- & * (тип) sizeof |
логическое отрицание поразрядное инвертирование внутреннего двоичного кода унарный плюс и минус инкремент (увеличение на 1) декремент (уменьшение на 1) взятие адреса взятие содержимого (см. п.1.5.3) приведение к типу определение размера в байтах |
|
3 |
* /
% |
арифметическое умножение и деление получение остатка от деления нацело |
|
4 |
+ - |
арифметические сложение и вычитание |
|
5 |
<< >> |
поразрядного сдвига |
|
6 |
< <= > >= |
отношения (меньше, меньше или равно и т. д.) |
|
7 |
== != |
отношения (равно, неравно) |
|
8 |
& |
Поразрядная конъюнкция |
|
9 |
^ |
Поразрядное исключающее "или" |
|
10 |
| |
Поразрядная дизъюнкция |
|
11 |
&& |
конъюнкция (логическое "и") |
|
12 |
|| |
дизъюнкция (логическое "или") |
|
13 |
? |
условная операция |
|
14 |
= операция= |
присваивание составное присваивание |
|
15 |
, |
операция "запятая" |
|
Рассмотрим особенности некоторых операций. Заметим, что скобки в языке Си в ряде случаев рассматриваются как бинарные операции. Так, например, например, квадратные скобки при указании индексов элемента массива и круглые скобки при обращении к функции (подробнее с этим можно ознакомиться в [2], с.42).
Унарная операция инкремент (увеличение на единицу или автоувеличение) имеет две формы: префиксную(++имя_переменной) и постфиксную (имя_переменной++). В случае префиксной формы увеличение значения операнда происходит до его использования, в случае постфиксной - после. Для лучшего понимания различия этих форм полезно проанализировать 2 фрагмента программы:
int i=1,c;
1-й фрагмент |
2-й фрагмент |
с=2*i++;/*”=” – знак присваивания*/ |
с=2*++i; |
/*в результатеi равно 2, с равно 2*/ |
/*i равно 2, с равно4*/ |
Аналогично существуют префиксная и постфиксная формы декремента. Заметим, что операции инкремент и декремент могут использоваться не только в выражениях, но и как самостоятельный оператор, увеличивающий или уменьшающий переменную на единицу.
Операция sizeof вычисляет размер в байтах для типа операнда. Она имеет две формы: sizeof(выражение)иsizeof(тип). Она использует в том случае, когда нужно построить алгоритм, обрабатывающий выражения различных типов.
Операция (тип)выражение осуществляет приведение выражения к типу, указанному в скобках.
Заметим, что Си допускает использование в выражении операндов различных типов (в отличии, например, от Паскаля, где строго отслеживается соответствие типов операндов и операций). Однако, для того, чтобы воспользоваться такой свободой, надо хорошо знать правила автоматического преобразования типов и иметь некоторый опыт программирования. Начинающим программистам рекомендуется без крайней необходимости не использовать операнды различных типов в пределах одного выражения и использовать для явного преобразования типов операцию (тип).
Если говорить о числовых типах, то в Си строго выдерживается правило: если в выражении все операнды одного типа, то и результат имеет тот же тип. Поэтому при делении двух целых операндов получается целый результат. Например, значением выражения 5/2 будет 2 (а не 2.5). Для получения вещественного результата надо использовать вещественные операнды (5.0/2.0).
В Си в качестве знака присваивания используется символ "=". Этот символ часто называется простым присваиванием в отличие от присваивания составного (см., например, [2]) Операция присваивания имеет вид: имя переменной=выражение;
Операция предполагает вычисление значения выражения, стоящего справа от знака присваивания, и запись его в ячейку, соответствующую переменной, имя которой стоит слева от этого знака. Результатом операции присваивания считается новое значение переменной. Чаще всего операция присваивания используется как самостоятельный оператор, обеспечивающий запись в ячейку нового значения. Именно как оператор (и только как оператор) присваивание существует в большинстве алгоритмических языков.
В Си, однако, присваивание является не только оператором, но и операцией (см. таблицу 3, операции ранга 14). Рассмотрение его как операции делает допустимой в отличии, например, от Паскаля цепочку: a=b=c=d=0, в результате которой все переменные, начиная с самой правой, получают значение 0 (или, конечно, любое другое значение).
Заметим, что в Си значение локальной (т.е. описанной в некоторой функции, в том числе и main) переменной считается неопределенным (фактически в ней хранится некоторое "мусорное" значение), если это значение не задано каким-либо способом (присваиванием, вводом, или инициализацией при описании). В Си существуют также статические переменные (см. п.2.4), значения которых при описании обнуляются (если, только, конечно, они не инициализируются другими значениями).