Правила записи программы на языке Си 5 Правила формального описания синтаксиса языка программирования 6
Вид материала | Лекции |
Содержание6.7.Простейшие функции, определяемые программистом 6.8.Дополнительные арифметические операции 6.9.Дополнительные операции присваивания 6.10.Битовые операции Результаты битовых операций |
- Правила преобразований из одного типа в другой и правила приведения типов в языке Object, 19.03kb.
- Оформление программы на языке Паскаль. Оператор вывода. Описание переменных. Оператор, 186.34kb.
- Программа наименование дисциплины Латинский язык (1,2 уровни), 154.48kb.
- Экзаменационные вопросы по курсу "Методы программирования", 32.44kb.
- Вопросы по курсу Программирование на языке высокого уровня (яву), 102.97kb.
- Структура программы в языке программирования С++. Обмен данными между функциями (параметры, 37.24kb.
- Программа курса " Азы программирования", 26.19kb.
- Структура программы языка Турбо Паскаль Программа на языке Турбо Паскаль имеет вид, 792.5kb.
- Эволюция языков программирования, 493.92kb.
- Структура программы на языке Turbo Pascal, 26.15kb.
6.7.Простейшие функции, определяемые программистом
Довольно часто программист сталкивается с тем, что стандартных функций, нужных ему, нет. Например, в библиотеке Turbo C нет функции для вычисления котангенса. В этом случае программист сам может задать нужную ему функцию. Функция должна быть оформлена специальным образом. Описание функции начинается заголовком:
БНФ:
заголовок_функции =
тип имя_функции"("[тип параметр {"," тип параметр}]")"
Например, заголовок функции вычисления котангенса:
double cotan ( double x )
За заголовком функции должно следовать тело функции, т.е. операторы, реализующие функцию. При этом они оформляются подобно операторам основной программы, т.е. тело функции начинается с "{" и заканчивается "}".
Для возврата в вызывающую функцию и для передачи ей вычисленного значения используется оператор return.
БНФ:
"return " [выражение];
Выражение должно быть того же типа, что и тип функции. Его значение будет передано вызывающей программе в качестве значения функции. Например, функцию для вычисления котангенса можно записать так:
double cotan( double x )
{
double ctg;
ctg = 1.0 / tan(x);
return ctg;
}
или
double cotan( double x )
{
return 1.0 / tan(x);
}
После того как функция определена, она может быть использована, так же как и стандартные функции Си, например можно записать:
a = b * cotan(c);
При этом значение c будет передано функции в качестве параметра x, затем будет вычислено выражение 1/tan(x) и передано в вызывающую программу в качестве значения функции cotan.
В функциях могут находится любые операторы языка и в любом количестве.
Собственные функции программиста в простейшем случае могут быть помещены в тот же файл, в котором находится основная программа, и должны располагаться в файле до того как они будут использоваться.
Если это по какой-либо причине не устраивает программиста, то он может в начало файла поместить прототипы всех используемых функций, т. е. заголовки функций, оканчивающихся точкой с запятой. В этом случае сами функции могут располагаться в любом месте файла.
6.8.Дополнительные арифметические операции
Язык Си имеет ряд уникальных операций, как правило, отсутствующих в других языках программирования. К этим операциям относятся операция увеличения на единицу ++ и операция уменьшения на единицу. Например:
a = a + 1; эквивалентно a++; или ++a;
Выполнение операций "++" или "--" вызывает увеличение или уменьшение на единицу значения соответствующей переменной.
Результат операций может быть различным в зависимости от того, где находятся знаки операций: если используется постфиксная операция, т.е операция ++ или -- записана после переменной, то результатом операции будет значение переменной до увеличения или уменьшения. Иными словами переменная сначала используется в выражении, а затем увеличивается или уменьшается. Например:
a = 4;
b = ( a++ ) * 5; /* здесь b = 20 */
Если используется префиксная операция, т. е. операция ++ или -- записана перед переменной, то результат операции - значение переменной после увеличения или уменьшения. Иными словами переменная вначале увеличивается или уменьшается, затем используется в выражении. Например:
a = 4;
b = ( ++ a ) * 5; /* здесь b = 25 */
Приоритет операций выше, чем у * или /, но все равно рекомендуется ставить скобки, чтобы не запутаться.
6.9.Дополнительные операции присваивания
Очень часто в программах присутствуют операторы вида
a = a + b;
a = a - b;
a = a * b;
a = a / b;
Они изменяют значения некоторых переменных. В языке Cи для сокращения программ и повышения их эффективности используются дополнительные операторы присваивания:
a += b;
a -= b;
a *= b;
a /= b;
a %= b;
Дополнительные операции присваивания должны быть записаны слитно, без пробелов. Действие операции - изменение значения переменной, стоящей слева от знака операции. Результат - значение измененной переменной.
Дополнительные операции присваивания имеют самый низкий приоритет и выполняются справа налево.
Использование операций ++, --, +=, , , /=, %= вместо обычных не является обязательным, но их применение считается хорошим стилем программирования на языке Cи.
6.10.Битовые операции
Любые данные, записанные в память ЭВМ, как известно, представляют собой последовательность бит, т.е. последовательность нулей и единиц. Например, любое число типа int будет занимать 2 байта в памяти, т.е 16 бит. Его можно рассматривать двояко: либо как целое число ( так и делается при выполнении операций *,/, +, - , % ), либо как последовательность бит, что возможно при использовании битовых операций.
Битовые операции выполняются независимо над каждым битом данных. Если операция двуместная, то она выполняется над соответствующими битами операндов.
В Си имеются следующие битовые операции:
~ битовое отрицание (одноместная),
& побитовое "и" (двуместная),
побитовое "исключающие или" (двуместная),
| побитовое "или" (двуместная).
Результат этих операций определяет таблица значений для всевозможных комбинаций бит двух операндов.
Результаты битовых операций
-
op1
op2
~op1
op1 & op2
op1 op2
op1 | op2
0
0
1
0
0
0
0
1
1
0
1
1
1
0
0
0
1
1
1
1
0
1
0
1
Рассмотрим несколько примеров.
Первый пример показывает, как с помощью операции | можно установить в единицу выбранные биты операнда:
/* a = 00001001 = 9 */
char a, b; /* 00011010 = 26 */
a = 9; /* -------- */
b = a | 26 /* b = 31 */ /* b = 00011011 = 31 */
Следующий пример показывает, как с помощью операции & можно обнулить старшую часть байта:
char a, b; /* a = 00101101 = 45 */
a = 45; /* 00001111 */
b = a & 0x0F; /* -------- */
/* b = 00001101 = 13 */
К битовым операциям относятся операции сдвига << и >> :
a << b сдвиг битов переменной a влево на b позиций,
a >> b сдвиг битов переменной a вправо на b позиций.
Например:
char a, b;
a = 26; /* a = 00011010 = 26 */
b = a << 2; /* b = 01101000 = 104 */
Сдвиг влево равносилен умножению на 2 в соответствующей степени. Сдвиг вправо - делению на 2 в соответствующей степени.
Все битовые операции выполняются слева направо. В следующей строке приведены битовые операции в порядке уменьшения их приоритета.
~, << >>, &, , |
Для двуместных битовых операций определены дополнительные операции присваивания:
a <<= b; эквивалентно a = a << b,
a >>= b; эквивалентно a = a >> b,
a &= b; эквивалентно a = a & b,
a = b; эквивалентно a = a b,
a |= b; эквивалентно a = a | b.