Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Арифметические операции
+ Добавляет значение справа от знака операции к значению слева от знака.
- Вычитает значение справа от знака операции из значения слева от знака.
- Как унарная операция, изменяет знак значения, указанного справа от знака операции.
* Умножает значение справа от знака операции на значение слева от знака.
/ Делит значение слева от знака операции на значение справа от знака.
Если оба операнда являются целочисленными, результат усекается.
% Выдает остаток от деления значения слева от знака на значение справа от знака
(только для целочисленных значений).
++ Добавляет 1 к значению переменной справа от знака операции (префиксная форма) или к значению слева от знака операции (постфиксная форма).
-- Подобна++, но вычитает 1.
188 Глава 5
Операции различного назначения
sizeof Возвращает размер в байтах операнда, указанного справа. Операндом может быть спецификатор типа в круглых скобках, например, sizeof (float), либо имя конкретной переменной, массива и т.д. без скобок, например, sizeof foo.
(тип) Как операция приведения, преобразует следующее за ней значение в тип, указанный внутри круглых скобок. Например, (float) 9 преобразует целочисленное значение 9 в число с плавающей запятой 9.0.
Функции с аргументами
К этому времени вы уже знакомы с использованием аргументов функций. Следующий щаг на пути к мастерству работы с функциями — научиться писать собственные функции, принимающие аргументы. Давайте кратко взглянем, в чем заключается этот навык. (Возможно, сейчас имеет смысл просмотреть еще раз пример функции butler(), приведенный в конце главы 2; он демонстрировал написание функции без аргументов.) Код в листинге 5.15 включает функцию pound(), которая выводит указанное количество знаков фунта (#). (Этот символ называют также знаком номера и хещ-символом.) Пример также иллюстрирует некоторые аспекты преобразования типов.
Листинг 5.15. Программа pound.с
Выполнение программы дает следующий вывод:
#####
#################################
######
Первым делом посмотрим на заголовок функции:
void pound(int n)
Если функция не принимает аргументов, в круглых скобках заголовка функции будет указано ключевое слово void. Поскольку функция pound() принимает один аргумент int, в круглых скобках содержится объявление переменной типа int nо имени n. Здесь можно указывать любое имя, соответствующее правилам именования языка С.
Операции, выражения и операторы 189
Объявление аргумента создает переменную, которая называется формальным аргументом или формальным параметром. В этом случае формальным параметром является переменная int с именем n. Вызов функции, такой как pound (10), приводит к присваиванию переменной n значения 10. В программе вызов pound (times) присваивает n значение переменной times (5). Мы говорим, что вызов функции передает значение, которое называется фактическим аргументом или фактическим параметром, так что вызов функции pound (10) передает функции фактический аргумент 10, при этом значение 10 присваивается формальному параметру (переменной n). Другими словами, значение переменной times в функции main() копируется в новую переменную п внутри функции pound().
НА ЗАМЕТКУ! Аргументы или параметры
Хотя термины аргумент и параметр часто применяются взаимозаменяемо, в стандарте С99 решено использовать термин аргумент для фактического аргумента или фактического параметра и термин параметр для формального параметра и формального аргумента. С учетом этого соглашения можно сказать, что параметры — это переменные, а аргументы — это значения, которые предоставляются вызовом функции и присваиваются соответствующим параметрам. Таким образом, в листинге 5.15 аргументом функции pound() является times, а ее параметром — n. Подобным же образом в вызове функции pound (times + 4) значение выражения times + 4 представляет собой аргумент.
Имена переменных являются закрытыми внутри функции. Это значит, что имя, определенное в одной функции, не будет конфликтовать с таким же именем, объявленным в каком-то другом месте. Если бы в функции pound() вместо n использовалась переменная times, это привело бы к созданию переменной, отличной от times в функции main(). То есть вы получили бы две переменных с одним и тем же именем, но программе хорошо известно, к какой функции относится та или иная переменная.
Теперь взглянем на вызовы функций. Первым вызовом является pound (times) и, как уже было сказано, он приводит к присваиванию переменной n значения times, равного 5. В результате эта функция выводит пять знаков фунта и знак новой строки.
Второй вызов функции — pound (ch). В данном случае переменная ch имеет тип char. Она инициализируется символом !, который в системах с кодировкой ASCII имеет числовое значение 33. Но char является неподходящим типом для функции pound(). Именно здесь вступает в действие прототип функции, расположенный в верхней части программы. Прототип — это объявление функции, в котором дается описание возвращаемого значения функции и всех ее аргументов. Рассматриваемый прототип сообщает следующие сведения о функции pound():
• функция не возвращает никакого значения (часть void);
• функция принимает один аргумент, которым является значение типа int.
В этом случае прототип информирует компилятор о том, что функция pound() ожидает передачи ей аргумента типа int. В ответ компилятор, достигая выражения pound (ch), автоматически применяет к аргументу ch приведение типа, преобразуя его в аргумент int. В данной системе аргумент преобразуется из значения 33, хранящегося в одном байте, в значение 33, размещенное в четырех байтах, в результате чего значение 33 приобретает корректную форму, чтобы его можно было использовать в данной функции. Аналогично в последнем вызове, pound (f), приведение типа применяется для преобразования переменной f типа float в тип, подходящий этому аргументу.
190 Глава 5
До выхода стандарта ANSI С в языке использовались объявления функций, которые не были прототипами — они только указывали имя функции и тип возвращаемого значения, но не типы аргументов. В целях обратной совместимости в С по-прежнему допускается применение такой формы:
void pound(); /* объявление функции в стиле, предшествующем ANSI */
А что случится, если в программе pound.с вместо прототипа использовать такую форму объявления? Первый вызов функции, pound (times), будет работать, поскольку типом аргумента times является int. Второй вызов, pound(ch), также будет работать, т.к. при отсутствии прототипа компилятор С автоматически повышает типы аргументов char и short до int. Однако третий вызов, pound(f), оказывается неудачным, потому что в условиях отсутствия прототипа тип float автоматически повышается до double, а от этого, в действительности, мало пользы. Программа по-прежнему будет выполняться, но ее поведение окажется некорректным. Это можно было бы исправить, используя явное приведение типа в вызове функции:
Читать дальшеИнтервал:
Закладка: