 |
main ()
{
puts("Hello, world");
}
Заметим, что в конце строки опущен \n; это не нужно, так как
puts сама добавляет этот символ.
Наоборот, функция putchar записывает единственный символ на
экран и не добавляет \n. Оператор putchar(ch) эквивалентен printf
("%c",ch).
Зачем же нужно использовать puts и/или putchar вместо
printf? Одним из доводов является тот, что программа, реализующая
printf, гораздо больше; если вы не нуждаетесь в ней (для числово-
го вывода или специального форматирования), то, используя puts и
putchar, можно сделать свою программу меньше и быстрее. Например,
файл .EXE, создаваемый компиляцией версии HELLO.C, использующий
puts, значительно меньше, чем файл .EXE для версии, использующей
printf.
- 411,412 -
Типы данных.
-----------------------------------------------------------------
При написании программы, вы работаете с некоторым видом ин-
формации, большинство которой попадает в один из 4-х основных ти-
пов: целые числа, числа с плавающей точкой, текст и указатели.
Целые - это числа, которые используются для счета ( 1, 2, 5,
-21 и 752, например).
Числа с плавающей точкой могут содержать дробные разряды и
экспоненту (5.4567*10^65). Иногда их называют действительными
(вещественными) числами (real).
Текст состоит из символов (а, Z, !, 3) и строк ("Это просто
проверка").
Указатели не хранят информацию; вместо этого каждый из них
содержит адрес памяти ЭВМ, в которой хранится информация.
Числа с плавающей точкой.
------------------------
Си поддерживает 4 основных типа данных в различных формах.
Вы уже использовали 2 из них: целые (int) и символы (char). Сей-
час будем модифицировать последнюю программу для использования
3-го типа: чисел с плавающей точкой (float). Войдите в редактор
Турбо Си и преобразуйте программу к следующему виду:
#include
main()
{
int a,b;
float ratio;
printf("Введите два числа: ");
scanf("%d %d,&a,&b);
ratio = a / b;
printf("Отношение = %f \n", ratio);
}
Сохраните ее под именем RATIO.C, выйдя в главное меню и выб-
рав команду File/Write. Затем нажмите R для компиляции и выполне-
- 413,414 -
ния программы. Введя два значения (такие, как 10 и 3), вы получи-
те результат (3.000000).
Вероятно, вы ожидали ответа 3.333333; почему же ответ ока-
зался только 3? Потому, что a и b имеют тип int, отсюда и резуль-
тат тоже типа int. Он был преобразован к типу float при присваи-
вании его ratio, но преобразование имело место после, а не до
деления.
Вернитесь в редактор и измените тип a и b на float; измените
также строку формата "%d %d" в scanf на "%f %f". Сохраните прог-
рамму (нажмите F2), затем компилируйте и выполняйте. Результат
теперь 3.333333, как и ожидалось.
Имеется также две версии типа float, известная как double и
long double. Как вы могли догадаться, переменные типа double в
два раза больше переменных типа float, а переменные типа long
double еще больше. Это означает, что они могут иметь больше зна-
чащих цифр и больший диапазон значений экспоненты. Стандартные
размеры и диапазоны значений для этих типов в Турбо Си описаны в
Главе 11.
Три типа целых
--------------
В дополнение к типу int, Си поддерживает версии short int и
long int, обычно сокращаемые до short и long. Фактические размеры
short, int и long зависят от реализации; все, что гарантирует Си
- это то, что переменная типа short не будет больше (то есть не
займет больше байтов), чем переменная типа long. В Турбо Си эти
типы занимают 16 битов (short), 16 битов (int) и 32 бита (long).
Беззнаковые
-----------
Си позволяет вам объявлять некоторые типы (сhar, short, int,
long) беззнаковыми (unsigned). Это означает, что вместо отрица-
тельных значений эти типы имеют только неотрицательные (больше
или равные нулю). Переменные такого типа могут поэтому хранить
большие значения, чем знаковые типы. Например, в Турбо Си пере-
менная типа int может содержать значения от -32768 до 32767; пе-
ременная же типа insigned int может содержать значения от 0 до
- 415,416 -
65535. Обе занимают одно и тоже место в памяти (16 битов в данном
случае); но используют ее по-разному. Опять же, см. главу 11 для
выяснения деталей.
Определение строки
------------------
Си не поддерживает отдельный строковый тип данных, но он все
же предусматривает два слегка отличающихся подхода к определению
строк. Один состоит в использовании символьного массива, другой
заключается в использовании указателя на символ.
Использование символьного массива
- - - - - - - - - - - - - - - - -
Выбирете команду Load из меню файла и загрузите программу
HELLO.C снова в редактор. Теперь приведите ее к следующему виду:
#include
#include
main ()
{
char msg[30];
strcpy(msg, "Hello, world");
puts(msg);
}
[30], после msg, предписывает компилятору выделить память
для 29 символов, то есть для массива из 29 переменных типа char
(30-е знакоместо будет заполнено нулевым символом - \0 - часто
называемым нулевым завершителем или ограничителем ). Переменная
msg не содержит символьное значение; она хранит адрес (некоторого
места в памяти) первого из этих 29 переменных типа char.
Когда компилятор обнаруживает оператор strcpy(msg, "Hello,
world"), он делает две вещи:
- Создает строку "Hello, world", ограниченную (\0) символом
(с кодом ASCII 0),в некотором месте файла объектного кода.
- Вызывает подпрограмму strcpy, которая копирует символы из
- 417,418 -
этой строки по одному в участок памяти, указываемый пере-
менной msg. Он делает это до тех пор пока не будет скопи-
рован нулевой символ в конце строки "Hello, world".
Когда вы вызываете функцию puts(msg), то ей передается зна-
чение msg - адрес первой буквы, на которую он указывает. Затем
puts проверяет, не является ли символ по этому адресу нулевым.
Если да, то puts заканчивает работу; иначе puts печатает этот
символ, добавляет единицу (1) к адресу и делает проверку на нуле-
вой символ снова.
Из-за этой зависимости от нулевого символа известно, что
строки в Си называются "завершающиеся нулем", т.е. они представ-
ляют из себя последовательности символов, заканчивающиеся нулевым
символом. Этот подход позволяет снять ограничения с длины строк;
строка может быть такой длины, какой позволяет память для ее хра-
 |
|