 |
нения.
Использование указателя на символ
---------------------------------
Второй метод, который можно использовать для определения
строк, - это указатель на символы. Отредактируйте вашу программу
к следующему виду:
#include
#include
main()
{
char *msg;
msg = "Hello, world";
puts(msg);
}
Звездочка (*) впереди msg указывает компилятору, что msg яв-
ляется указателем на символ; другими словами, msg может хранить
адрес некоторого символа. Однако, при этом компилятор не выделяет
никакого пространства для размещения символов и не инициализирует
msg каким-либо конкретным значением.
Когда компилятор находит оператор msg = "Hello,world ", он
- 419,420 -
делает две вещи:
- Как и раньше, он создает строку "Hello, world\n", ограни-
ченную нулевым символом, где-то внутри файла объектного
кода.
- Присваивает начальный адрес этой строки - адрес символа H
переменной msg.
Команда puts(msg) работает так же, как и раньше, печатая
символы до тех пор, пока она не встретит нулевой символ.
Имеется тесная зависимость между методами массива и указате-
ля при определении строк, которые мы обсудим в следующей главе.
Идентификаторы
--------------
До сих пор мы давали имена переменным, не заботясь о том,
какие на них накладываются ограничения. Давайте теперь обсудим
эти ограничения.
Имена, которые вы даете константам, типам данных, переменным
и функциям называются идентификаторами. Некоторые из идентифика-
торов, мы использовали ранее - это:
char, int, float предопределенные типы данных
main главная функция программы
name,a,b,sum,msg,ratio переменные, определенные пользовате-
лем
scanf, printf, puts стандартные библиотечные функции
В Турбо Си имеется несколько правил об идентификаторах; вот
краткая их сводка:
- Все идентификаторы должны начинаться с буквы (a...z,
A...Z) или с подчеркивания (_).
- Остальная часть идентификатора может состоять из букв,
подчеркиваний и/или цифр (0...9). Никакие другие символы
не разрешены.
- Идентификаторы являются чувствительными от типа букв. Это
- 421,422 -
означает, что строчные буквы (a...z) - это не тоже самое,
что прописные буквы (A...Z). Например, идентификаторы
indx, Indx, INDX различны и отличаются друг от друга.
- Значимыми являются первые 32 символа идентификатора.
Операции
-----------------------------------------------------------------
Итак, вы научились получать данные в программу (и в ваши пе-
ременные); что же вы собираетесь делать с ними? Вероятно, как-то
с ними манипулировать, используя допустимые операции. Язык Си об-
ладает большим количеством таких операций.
Операция присваивания
---------------------
Самой общей операцией является присваивание, например, ratio
= a/b или ch = getch(). В Си присваивание обозначается одним зна-
ком равенства (=); при этом значение справа от знака равенства
присваивается переменной слева.
Можно применять также последовательные присваивания, напри-
мер: sum = a = b. В таких случаях присваивание производится спра-
ва налево, то есть b будет присвоено a, которая в свою очередь
будет присвоена sum, так что все три переменных получат одно и то
же значение (а именно, начальное значение b).
- 423,424 -
Одноместные и двуместные операции
---------------------------------
Си поддерживает обычный набор арифметических операций:
- умножение (*)
- деление (/)
- целочисленное деление (%)
- сложение (+)
- вычитание (-)
Турбо Си поддерживает одноместный минус (a + (-b)), который
выполняет двоичное дополнение как в расширении ANSI. Кроме этого,
Турбо Си поддерживает одноместный плюс (a + (+b)).
Операции приращения (++) и уменьшения (--)
------------------------------------------
В Си имеются некоторые специальные одноместные и двуместные
операции. Наиболее известными являются одноместные операции при-
ращения (++) и уменьшения (--). Они позволяют вам использовать
единственную операцию, которая добавляет 1 или вычитает 1 из лю-
бого значения; сложение и вычитание может быть выполнено в сере-
дине выражения, причем вы можете даже решить, сделать это до или
после вычисления выражения. Рассмотрим следующие строки програм-
мы:
sum = a + b++;
sum = a + ++b;
Первая означает: "сложить a и b, присвоить результат sum и
увеличить b на единицу".
Вторая означает: "увеличить b на единицу, сложить a и b, и
присвоить результат sum".
Это очень мощные операции, расширяющие возможности языка,
однако перед их использованием нужно убедиться, что вы хорошо по-
нимаете их действие. Измените SUM.C, как показано ниже, а затем,
перед ее запуском, попытайтесь определить, что она выведет:
- 425,426 -
#include
main()
{
int a, b, sum;
char *format;
format = "a = %d b = %d sum = %d \n";
a = b = 5;
sum = a + b; printf(format,a,b,sum);
sum = a++ + b; printf(format,a,b,sum);
sum = ++a + b; printf(format,a,b,sum);
sum = --a + b; printf(format,a,b,sum);
sum = a-- + b; printf(format,a,b,sum);
sum = a + b; printf(format,a,b,sum);
}
Побитовые операции
------------------
Для обработки на уровне битов Си имеет следующие операции:
 |
|