ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ C 1
МОДУЛЬ 1. ВВЕДЕНИЕ В ЯЗЫК C Лексемы и пробельные символы Основные типы данных Диапазоны представляемых значений Декларация переменных Константы Знакомство с интегрированной средой Visual C 2
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C НЕМНОГО ИСТОРИИ (НАЧАЛО) 1969– 1972 — на базе языка B ( «би» ) — упрощенного варианта BCPL (Basic Combined Programming Language — Мартин Ричардс, Кембриджский университет, 1966) — начинается проектирование нового языка программирования 1972 — сотрудник Bell Telephone Laboratories Деннис Ритчи создает язык C ( «си» ) для разработки ОС UNIX на платформе PDP-7 1973 — на язык C перенесен значительный фрагмент ядра Unix для PDP-11, ранее разработанный на языке ассемблера 1978 — в США выходит книга Брайана Кернигана и Денниса Ритчи с описанием языка C, надолго ставшая 3 неформальным стандартом для программистов (K&R C) Kernighan, Brian W. ; Ritchie, Dennis M. The C Programming Language. Englewood Cliffs, NJ: Prentice Hall (1978)
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C НЕМНОГО ИСТОРИИ (ПРОДОЛЖЕНИЕ) 1985 — книга Б. Кернигана и Д. Ритчи переведена на русский язык Керниган Б. , Ритчи Д. , Фьюер А. Язык программирования Си. Задачи по языку Си / Пер. с англ. — М. : Финансы и статистика, 1985. — 279 с. 1988 — выходит в свет 2 -е издание книги Б. Кернигана и Д. Ритчи (первое описание будущего стандарта ANSI C) Kernighan, Brian W. ; Ritchie, Dennis M. The C Programming Language (2 nd ed. ). Englewood Cliffs, NJ: Prentice Hall (1988) 1989 — созданный в 1983 г. комитет Американского института стандартов (ANSI) ратифицирует стандарт X 3. 159 -1989 “Programming Language C” (ANSI C, Standard C, C 89) 1990 — Международная организация по стандартизации (ISO) принимает стандарт ANSI C как стандарт ISO/IEC 9899: 1990 (C 90) 4
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C НЕМНОГО ИСТОРИИ (ОКОНЧАНИЕ) 1992 — 2 -е издание книги Б. Кернигана и Д. Ритчи выходит в России Керниган Б. , Ритчи Д. Язык программирования Си / Пер. с англ. — М. : Финансы и статистика, 1992. — 272 с. 1999 — опубликован стандарт ISO/IEC 9899: 1999 (C 99) к числу стандартных возможностей языка добавлены встроенные (inline) функции, новые типы данных (long int, complex и др. ), массивы переменной длины, макроопределения с переменной местностью и однострочные комментарии 2007 — начата работа над новым вариантом стандарта (так называемым “C 1 x”) 5
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C АЛФАВИТ И ЛЕКСЕМЫ ЯЗЫКА C Алфавит буквы: A, B, C, …, Z, a, b, c, …, z цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 специальные символы: + – / %. ? ! " < > | ' _ & ~ ^ знаки пунктуации языка: [ ] ( ) { } , ; : … * = # пробельные символы: ˽ (пробел), ↳ (символ табуляции), ↲ (символ перевода строки) прочие символы — только в комментариях к тексту программы Лексемы — идентификаторы, ключевые слова, константы, операции, разделители единицы текста программы, которые при компиляции воспринимаются как единое целое и по смыслу не могут быть разделены на более мелкие элементы [Под 04] 6
7
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C ИДЕНТИФИКАТОРЫ И КЛЮЧЕВЫЕ СЛОВА Идентификатор — любая последовательность букв A, B, C, …, Z, a, b, c, …, z, цифр 0, 1, …, 9 и символов подчеркивания _ , не начинающаяся с цифры и имеющая длину не более 31 символа. Строчные и прописные буквы в идентификаторах различаются компиляторами Ключевое слово — одно из слов языка, входящих в следующий список: спецификаторы типов: char, double, enum, float, int, long, short, struct, signed, union, unsigned, void, typedef квалификаторы типов: const, volatile квалификаторы классов памяти: auto, extern, register, static операторы языка и идентификаторы специального назначения: break, continue, do, for, goto, if, return, switch, while; default, case, else, sizeof модификаторы и псевдопеременные: конкретный набор зависит от 8 компилятора
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C КОНСТАНТНЫЕ ЗНАЧЕНИЯ (НАЧАЛО) Константа — неизменяемое арифметическое значение целого, вещественного, символьного или перечислимого типа, нулевой указатель либо строковый литерал: целые — записываются в системах счисления по основаниям 10, 8, 16: (целочисленный) нуль в любой системе счисления — 0 десятичные — последовательность десятичных цифр, не начинающаяся с нуля восьмеричные — последовательность восьмеричных цифр, начинающаяся с нуля шестнадцатеричные — последовательность шестнадцатеричных цифр, начинающаяся с 0 x или 0 X вещественные — записываются в десятичной системе в следующих форматах: [+|-]<целая часть>. [<дробная часть>] [+|-]<целая часть>{e|E}[+|-]<порядок>. [<дробная часть>][{e|E}[+|-]<порядок>] где<целая часть> есть целая часть абсолютной величины десятичной мантиссы, <дробная часть> — дробная часть абсолютной величины десятичной мантиссы, <порядок> — абсолютная величина десятичного порядка (экспоненциальной части числа) 9
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C КОНСТАНТНЫЕ ЗНАЧЕНИЯ (ОКОНЧАНИЕ) символьные — записываются естественным образом* или посредством ESC-последовательностей**, *** согласно следующим правилам: * символы, имеющие экранное представление — любой входящий или не входящий в алфавит языка единичный символ в обрамлении апострофов ('); ** ряд символов, лишенных экранного представления — одна из следующих управляющих последовательностей: 'n' — перевод строки; 't' — горизонтальная табуляция; 'r' — возврат каретки; '\' — обратная косая черта; ''' — апостроф; '"' — двойная кавычка; ' ' — нулевой символ; 'a' — звонок; 'b' — возврат на одну позицию; 'f' — перевод страницы; 'v' — вертикальная табуляция; '? ' — знак вопроса; *** любой символ — собственный восьмеричный код в виде 'ooo', где o — цифра от 0 до 7, либо шестнадцатеричный код в виде 'xhh' или 'Xhh', где h — цифра от 0 до F; перечислимые — задаются в определении программистом собственного типа-перечисления; нулевой указатель — единственная неарифметическая константа, представимая различными компиляторами как 0, 0 L или NULL (значение NULL может не совпадать с нулем (0) и (или) нулевым символом (' ’)); строковый литерал — заключенная в двойные кавычки (") последовательность символов, записанных по правилам для символьных констант *, *** без обрамляющих апострофов 10
Модуль 3. ОПЕРАЦИИ ЗНАКИ И ПРИОРИТЕТ ОПЕРАЦИЙ (НАЧАЛО) Приорите т операций Знаки операций Порядок выполнения операций с равным приоритетом 1 ( ) [ ] ->. слева направо 2 ! ~ + – ++ – – & * (<имя типа>) sizeof справа налево 3 * / % слева направо 4 + – слева направо 5 << >> слева направо 6 < <= >= > слева направо 7 == != слева направо 8 & слева направо 9 ^ слева направо 11
Модуль 3. ОПЕРАЦИИ ЗНАКИ И ПРИОРИТЕТ ОПЕРАЦИЙ (ОКОНЧАНИЕ) Приорите т операций Знаки операций Порядок выполнения операций с равным приоритетом 10 | слева направо 11 && слева направо 12 || слева направо 13 ? : справа налево 14 = *= /= %= += –= &= ^= |= <<= >>= справа налево 15 , слева направо 12
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Комментарии – пояснения к тексту программы. Например, /*Это комментарий языка С*/ /* Может быть многострочным /*, но не может быть вложенным*/ */ //Это однострочный комментарий языка С++ и стандарта С 99 13
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C РАЗДЕЛИТЕЛИ Разделитель — парный или одиночный знак пунктуации, входящий в следующий список: [ ] ( ) { } , ; : … * = # 14
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Пример – Привет, Мир! 15
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Операции в рабочем пространстве 1. Создание проекта (консольного приложения) 1. 1. Меню: File New Диалог "New", Вкладка "Projects". 1. 2. Выбрать из списка название проекта "Win 32 Console Application". 1. 3. Поле ввода "Project Name": Ввести с клавиатуры имя проекта, например, first. 1. 4. Поле ввода "Location": Обратить внимание на то, где локализована папка проекта в файловой системе (нажав кнопку можно изменить размещение этой папки). 1. 5. Нажать кнопку OK Окно мастера "Win 32 Console Application - Step 1 of 1". 1. 6. Установить переключатель в положение "An empty project". 1. 7. Нажать кнопку "Finish" Диалог "New project information". Просмотреть информацию о созданном проекте. 1. 8. Нажать кнопку OK. Новый проект создан!!! 16
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C 2. Создание нового файла (исходного модуля) в проекте 2. 1. Меню: File New Диалог "New", Вкладка "Files". 2. 2. Выбрать из списка тип файла "C++ Source File"[1]. 2. 3. Поле ввода "File Name": Ввести с клавиатуры имя файла (для файла на языке C обязательно явно указать расширение. с!!!), например, hello. c. 2. 4. Флажок "Add to project": должен быть установлен!!! 2. 5. Нажать кнопку OK. Новый файл (исходный модуль) в проекте создан!!! 17
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Компиляция, редактирование связей и выполнение программы Эти операции могут быть выполнены 3 способами каждая: 1 сп. С помощью командной кнопки панели Build Mini. Bar ; 2 сп. Соответствующей командой меню Build; 3 сп. Нажатием соответствующего сочетания клавиш. Компиляция: Кнопка Build Compile; Ctrl+F 7. Редактирование связей (компоновка): Кнопка Build; F 7. Выполнение: Кнопка Build Execute; Ctrl+F 5. 18
ЭТАПЫ СОЗДАНИЯ ИСПОЛНЯЕМОЙ 1. ВВЕДЕНИЕ В ЯЗЫК C Модуль ПРОГРАММЫ Объединенная единым алгоритмом совокупность описаний и операторов образует программу на алгоритмическом языке. Для того чтобы выполнить программу, требуется перевести ее на язык, понятный процессору — в машинные коды. Этот процесс состоит из нескольких этапов. Этапы для языка С++. Сначала программа передается препроцессору, который выполняет директивы, содержащиеся в ее тексте (например, включение в текст так называемых заголовочных файлов — текстовых файлов, в которых содержатся описания используемых в программе элементов). Получившийся полный текст программы поступает на вход компилятора, который выделяет лексемы, а затем на основе грамматики языка распознает выражения и операторы, построенные из этих лексем. При этом компилятор выявляет синтаксические ошибки и в случае их отсутствия строит объектный модуль. Компоновщик, или редактор связей, формирует исполняемый модуль программы, подключая к объектному модулю другие объектные модули, в том числе содержащие функции библиотек, обращение к которым содержится в любой программе (например, для осуществления вывода на экран). Если программа состоит из нескольких исходных файлов, они компилируются по отдельности и объединяются на этапе 19 компоновки. Исполняемый модуль имеет расширение. ехе и запускается на выполнение обычным образом.
20
СТРУКТУРА ПРОГРАММЫ Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Программа на языке C++ состоит из функций, описаний и директив препроцессора (команды для препроцессора). Одна из функций должна иметь имя main(). Выполнение программы начинается с первого оператора этой функции. Простейшее определение функции имеет следующий формат: тип_возвращаемого_значения имя ([ параметры ] ){ операторы, составляющие тело функции } Как правило, функция используется для вычисления какого-либо значения, поэтому перед именем функции указывается его тип. • если функция не должна возвращать значение, указывается тип void: • тело функции является блоком и, следовательно, заключается в фигурные скобки; • функции не могут быть вложенными; • каждый оператор заканчивается точкой с запятой (кроме составного 21 оператора).
ПРИМЕР СТРУКТУРЫ ПРОГРАММЫ, СОДЕРЖАЩЕЙ ФУНКЦИИ MAIN, F 1 И F 2: Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C директивы препроцессора описания int main(){ операторы главной функции } int fl(){ операторы функции f l } int f 2(){ операторы функции f 2 } Программа может состоять из нескольких модулей (исходных файлов). 22
ФОРМАТНЫЙ ВВОД-ВЫВОД Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Несколько предварительных замечаний о вводе/выводе. В языке C++ нет встроенных средств ввода/вывода — он осуществляется с помощью функций, типов и объектов, содержащихся в стандартных библиотеках. Используется два способа: функции, унаследованные из языка С, и объекты C++. В С все операции ввода-вывода данных ассоциируются с понятием «поток» . «Поток» – абстракция, которая находится между программой и конкретным устройством. Понятие потока позволяет программисту не заботится о взаимодействии программы с конкретными устройствами в составе вычислительной системы. При запуске программы автоматически открываются и подключаются к ней 5 стандартных потоков (3 основных и 2 вспомогательных). 23
ФОРМАТНЫЙ ВВОД-ВЫВОД Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Несколько предварительных замечаний о вводе/выводе. В языке C++ нет встроенных средств ввода/вывода — он осуществляется с помощью функций, типов и объектов, содержащихся в стандартных библиотеках. Используется два способа: функции, унаследованные из языка С, и объекты C++. В С все операции ввода-вывода данных ассоциируются с понятием «поток» . «Поток» – абстракция, которая находится между программой и конкретным устройством. Понятие потока позволяет программисту не заботится о взаимодействии программы с конкретными устройствами в составе вычислительной системы. При запуске программы автоматически открываются и подключаются к ней 5 стандартных потоков (3 основных и 2 вспомогательных). Основные стандартные потоки: stdout –выходной stdin –входной stderr –сообщений об ощибках Вспомогательные потоки: stdprn –принтера (параллельного порта) stdaux – последовательного порта 24
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C 25
Формат функции: printf(<форматная (управляющая )строка> [, <выражение 1>, …, <выражение N>]); C Модуль 1. ВВЕДЕНИЕ В ЯЗЫК Где форматная строка может включать в себя следующие компоненты: - допустимые в строковой константе символы алфавита языка – выводятся на экран без изменения; - специальные символы; -спецификаторы форматов (начинаются с символа %) – определяют порядок вывода и представление выводимых данных. Пример программы, использующей функции ввода/вывода в стиле С: #include
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Символ типа Тип аргумента d, i, u, int Десятичное целое со знаком o int Восьмеричное целое без знака x int Шестнадцатеричное целое без знака, использующее "abcdef" X int Шестнадцатеричное целое без знака, использующее "ABCDEF" f double Значение со знаком в формате [-]dddd, где dddd - одна или более десятичных цифр e double Значение со знаком в формате IEEE. Символ "e" строчный (маленький) E double Значение со знаком в формате IEEE. Символ "E" прописной (большой) g double Значение печатается в формате "f" или "e" в зависимости от того, какой из них более компактен для данного значения и точности G double Идентичен формату "g" за исключением того, что экспоненту представляет символ "E" c int Одиночный символ s строка Символы строки печатаются до первого нулевого символа (' ') или до достижения значения заданной точности p Указатель far на void Печатается адрес, указанный аргументом, в формате xxxx: yyyy, где xxxx - сегмент, yyyy - смещение, а x и y - строчные шестнадцатеричные цифры Формат вывода 27
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Более сложные форматы конструируются по следующей форме: %[флаги][ширина][. точность][модификатор]тип В квадратных скобках показаны необязательные части формата. тип – задает тип выводимых данных и их вид на экране. На этом месте может стоять один из следующих символов: Символ Задаваемый тип данных c char d, i int u, o, x, X unsigned f, e, E, g, G float s строка модификатор - символ, уточняющий тип данных. На этом месте может стоять один из следующих символов: h short l long, double L long double, long. точность - число, которое задает количество знаков после десятичной точки при выводе вещественных чисел. При указании точности, функция printf будет осуществлять округление выводимых чисел до указанного количества знаков по правилам математики. 28
ширина - число, которое задает размер в символах поля вывода информации. Отсчитывается от положения текстового курсора, когда функция printf начнет выводить информацию согласно формату. Используется ширина поля для стабилизации вывода, чтобы функция всегда выводила нужное количество символов, например в ячейки таблицы. флаги - управляют форматом вывода и представляются следующими символами: - выровнять информацию относительно поля вывода влево (по умолчанию информация выравнивается вправо) + всегда выводить число с указанием знака 0 вывести число с лидирующими нулями (нужно указать ширину поля) # вывести число с указанием системы счисления (0 – для восьмеричной, 0 x или 0 X для шестнадцатеричной) Примеры использования более сложных форматов: //вывод числа с округлением его до двух знаков в дробной части printf("Сторона квадрата равна %. 2 f см. n", a) ; // вывод числа, которое содержится в переменной x типа int, в // разных системах счисления с указанием основания системы printf("x = %d = %#o = %#xn", x, x, x) ; // вывод числа, которое содержится в переменной x типа int, в // ячейку таблицы с указанием размера ячейки и выравнивания // влево printf("%-8 d", x) ; 29
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Функция scanf - обеспечивает форматный ввод данных из потока stdin. Формат функции: scanf(<форматная (управляющая )строка> [, <адрес переменной 1>, …, <адрес переменной N>]); Где форматная строка может включать в себя следующие компоненты: - допустимые в строковой константе символы алфавита языка – должны быть повторены при вводе; - специальные символы - должны быть повторены при вводе; -спецификаторы форматов (начинаются с символа %) – определяют порядок ввода и преобразование вводимых данных. список_адресов_переменных - имена переменных, перечисленных через запятую, перед каждым именем переменной должен стоять знак &, которым обозначают операцию получения адреса переменной. Примеры ввода данных функцией scanf: // Получение целого числа и запись его в переменную m типа int scanf("%d", &m) ; // Получение целого числа в шестнадцатеричном формате scanf("%x", &h) ; // Получение двух чисел: целого и вещественного scanf("%d%f", &i, &p) ; 30
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C Назначение префиксов в спецификации формата вывода Символ префикса h, l Назначение Префиксы, которые определяют размер ожидаемого аргумента: h - используется как префикс перед типами d, i, o, x, X для указания того, что тип аргумента short int, или с u для указания того, что тип аргумента short unsigned int; l - используется как префикс перед типами d, i, o, x, X для указания того, что тип аргумента long int, или с u для указания того, что тип аргумента long unsigned int; он также используется с типами e, E, f, q, G - для указания того, что тип аргумента double, а не float (%lf, %le, %lg – для ввода double, но для вывода только long double). 31
ИСПОЛЬЗОВАНИЕМ БИБЛИОТЕКИ КЛАССОВ C++: Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C А вот как выглядит та же программа с использованием библиотеки классов C++: #include
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C ПЕРЕМЕННЫЕ И КОНСТАНТЫ Переменная — это именованная область памяти, в которой хранятся данные определенного типа. У переменной есть имя и значение. Имя служит для обращения к области памяти, в которой хранится значение. Во время выполнения программы значение переменной можно изменять. Перед использованием любая переменная должна быть описана. При описании можно присвоить переменной начальное значение, это называется инициализацией. Инициализатор можно записывать в двух формах — со знаком равенства или в круглых скобках Описание переменных [с инициализацией] [класс памяти] <имя типа> <переменная 1>[[= <значение 1>], …, <переменная N> [= <значение N>]]; Модификатор const показывает, что значение переменной изменять нельзя. Такую переменную называют именованной константой, или просто константой. Описание констант (при описании константа должна быть 33 инициализированна) const [<имя типа>] <имя константы> = <значение константы>;
ПРИМЕРЫ ОПИСАНИЯ ПЕРЕМЕННЫХ short int а = 1; // целая переменная а const char С = 'С' ; // символьная константа С char s. sf = 'f ; // инициализация относится // только к sf char t (54); float с = 0. 22, x(3), sum Если переменная определена внутри блока (напомню, что блок ограничен фигурными скобками), она называется локальной, область ее действия — от точки описания до конца блока, включая все вложенные блоки. Если переменная определена вне любого блока, она называется глобальной по отношению к блоку и областью ее действия считается файл, в котором она определена, от точки описания до конца блока, в котором она определена или его конца. 34
КЛАСС ПАМЯТИ Класс памяти определяет время жизни и область видимости программного объекта (в частности, переменной). Если класс памяти не указан явным образом, он определяется компилятором исходя из контекста объявления. Время жизни может быть постоянным (в течение выполнения программы) и временным (в течение выполнения блока). Областью видимости идентификатора называется часть текста программы, из которой допустим обычный доступ к связанной с идентификатором областью памяти. Чаще всего область видимости совпадает с областью действия. Исключением является ситуация, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия. Тем не менее к этой переменной, если она глобальная, можно обратиться, используя операцию доступа к области видимости : : . Для задания класса памяти используются следующие спецификаторы: auto — автоматическая переменная. Память под нее выделяется в стеке и при необходимости инициализируется каждый раз при выполнении оператора, содержащего ее определение. Освобождение памяти происходит при выходе из блока, в котором описана переменная. Время ее жизни — с момента описания до конца блока. Для глобальных переменных этот спецификатор не используется, а для локальных он принимается по умолчанию, поэтому задавать его явным образом большого смысла не имеет. extern — означает, что переменная определяется в другом месте программы (в другом файле или дальше по тексту). Используется для создания переменных, доступных во всех модулях программы, в которых они объявлены. static — статическая переменная. Время жизни — постоянное. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной. В зависимости от расположения оператора описания статические 35 переменные могут быть глобальными и локальными. Глобальные статические переменные видны только в том модуле, в котором они описаны. register — аналогично auto, но память выделяется по возможности в регистрах процессора. Если такой возможности у компилятора нет, переменные обрабатываются как auto.
ПРИМЕРЫ (ЛОКАЛЬНАЯ И ГЛОБАЛЬНАЯ ПЕРЕМЕННЫЕ) int а; //1. глобальная переменная а int main(){ int b; // 2. локальная переменная b extern int X; //3. переменная x определена в другом месте static int с; // 4. локальная статическая переменная с а = 1; //5. присваивание глобальной переменной int а; // 6. локальная переменная а а = 2; //7. присваивание локальной переменной : : а = 3; //8. присваивание. глобальной переменной return 0; } int X = 4; // 9. определение и инициализация х 36
Модуль 1. ВВЕДЕНИЕ В ЯЗЫК C 37
ОСНОВНЫЕ ТИПЫ ДАННЫХ 1. ВВЕДЕНИЕ В ЯЗЫК C Модуль Имя типа Размер области памяти (бит) Диапазон значений (для вещественных типов — по абсолютной величине) unsigned char 8 0 … 255, 'x 00' … 'x. FF' [signed] char 8 -128 … 127 unsigned short [int] 16 0 … 65535 [signed] short [int] 16 -32768 … 32767 enum 32 -2147483648 … 2147483647 unsigned [int] 32 0 … 4294967295 [signed] int 32 -2147483648 … 2147483647 unsigned long 32 0 … 4294967295 [signed] long 32 -2147483648 … 2147483647 float 32 3. 4 E-38 … 3. 4 E 38 [long] double 64 1. 7 E-308 … 1. 7 E 308 38 • short (короткий); • long (длинный); • signed (знаковый); • unsigned (беззнаковый) – спецификаторы типа, уточняющие внутреннее представление и диапазон значений стандартных типов
ОПЕРАЦИИ (НАЧАЛО) В соответствии с количеством операндов, которые используются в операциях, они делятся на унарные (один операнд), бинарные (два операнда) и тернарную (три операнда). Операции увеличения и уменьшения на 1 (++ и —). Эти операции, называемые также инкрементом и декрементом, имеют две формы записи — префиксную, когда операция записывается перед операндом, и постфиксную. В префиксной форме сначала изменяется операнд, а затем его значение становится результирующим значением выражения, а в постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется. #include
ОПЕРАЦИИ (ПРОДОЛЖЕНИЕ) Операция определения размера sizeof предназначена для вычисления размера объекта или типа в байтах, и имеет две формы: sizeof выражение sizeof ( тип ) Пример: #include
ОПЕРАЦИИ (ПРОДОЛЖЕНИЕ) Операции отрицания (-, I и ~). Арифметическое отрицание (унарный минус -). Логическое отрицание (!) дает в результате значение О, если операнд есть истина (не нуль), и значение 1, если операнд равен нулю. Операнд должен быть целого или вещественного типа, а может иметь также тип указатель. Поразрядное отрицание (~), часто называемое побитовым, инвертирует каждый разряд в двоичном представлении целочисленного операнда. Деление (/) и остаток от деления (%). Операция деления применима к операндам арифметического типа. Если оба операнда целочисленные, результат операции округляется до целого числа, в противном случае тип результата определяется правилами преобразования (Павловская, приложение 3). Операция остатка от деления применяется только к целочисленным операндам. Знак результата зависит от реализации. #include
ОПЕРАЦИИ (ПРОДОЛЖЕНИЕ) Операции отношения (<. <=, >. >=. =. !=) сравнивают первый операнд со вторым. Операнды могут быть арифметического типа или указателями. Результатом операции является значение true или false (любое значение, не равное нулю, интерпретируется как true). Операции сравнения на равенство и неравенство имеют меньший приоритет, чем остальные операции сравнения. Поразрядные операции (&, |, ^) применяются только к целочисленным операндам и работают с их двоичными представлениями. При выполнении операций операнды сопоставляются побитово (первый бит первого операнда с первым битом второго, второй бит первого операнда со вторым битом второго, и т д. ). При поразрядной конъюнкции, или поразрядном И (операция обозначается &) бит результата равен 1 только тогда, когда соответствующие биты обоих операндов равны 1. При поразрядной дизъюнкции, или поразрядном ИЛИ (операция обозначается |) бит результата равен 1 тогда, когда соответствующий бит хотя бы одного из операндов равен 1. При поразрядном исключающем ИЛИ (операция обозначается ^) бит результата равен 1 только тогда, когда соответствующий бит только одного из операндов равен 1. #inclucle
ОПЕРАЦИИ (ПРОДОЛЖЕНИЕ) Логические операции (&& и ||). Операнды логических операций И (&&) и ИЛИ (||) могут иметь арифметический тип или быть указателями, при этом операнды в каждой операции могут быть различных типов. Преобразования типов не производятся, каждый операнд оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю — как true). Результатом логической операции является true или fal se. Результат операции логическое И имеет значение true только если оба операнда имеют значение true. Результат операции логическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true. Логические операции выполняются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется. 43
ОПЕРАЦИИ (ПРОДОЛЖЕНИЕ) Операции присваивания (=, +=, -=, *= и т. д. ). Операции присваивания могут использоваться в программе как законченные операторы. Формат операции простого присваивания (=): операнд_! = операнд_2 Первый операнд должен быть L-значением, второй — выражением. Так обозначается любое выражение, адресующее некоторый участок памяти, в который можно занести значение. Название произошло от операции присваивания, поскольку именно ее левая (Left) часть определяет, в какую область памяти будет занесен результат операции. Переменная является частным случаем L -значения. Сначала вычисляется выражение, стоящее в правой части операции, а потом его результат записывается в область памяти, указанную в левой части (мнемоническое правило: «присваивание — это передача данных "налево"» ). То, что ранее хранилось в этой области памяти, естественно, теряется. #include
ОПЕРАЦИИ (ПРОДОЛЖЕНИЕ) В сложных операциях присваивания ( +=, * «=, /== и т п. ) при вычислении выражения, стоящего в правой части, используется и L-значение из левой части. Например, при сложении с присваиванием ко второму операнду прибавляется первый, и результат записывается в первый операнд, то есть выражение а += b является более компактной записью выражения а = a + b. Условная операция (? : ). Эта операция тернарная, то есть имеет три операнда. Ее формат: операндах ? операнд_2 : операндов Первый операнд может иметь арифметический тип или быть указателем. Он оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный пулю — как true). Если результат вычисления операнда 1 равен true, то результатом условной операции будет значение второго операнда, иначе — третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращенной формой условного оператора if. #inc 1 ude
Список литературы [КР 92] Керниган Б. , Ритчи Д. Язык программирования Си / Пер. с англ. — М. : Финансы и статистика, 1992. — 272 с. [КР 06] Керниган Б. , Ритчи Д. Язык программирования C / Пер. с англ. — М. : Вильямс, 2006. — 304 с. [Под 04] Подбельский В. В. , Фомин С. С. Программирование на языке Си. – 2 -е доп. изд. – М. , Финансы и статистика, 2004. – 600 с. 46 46


