char
, для целых чисел - int
, для чисел с плавающей точкой - float
и double
.
Объявление любой переменной должно соответствовать следующему формату:
[модификаторы] тип имя_переменной;
Замечание 1. После объявления переменной происходит выделение памяти, необходимой для её хранения, однако начальное значение не определено до тех пор пока переменная не будет инициализирована! Для инициализации переменной достаточно присвоить ей некоторое значение:
имя_переменной = значение;
Операции объявления переменной и её инициализации можно совмещать:
[модификаторы] тип имя_переменной = значение;
Замечание 2. Необязательный элемент объявления [модификаторы] может применяться для уточнения типа переменной. Подробности рассмотриваются в курсе лекций. Также дополнительную информацию можно получить из книги K&R C.
$ vim types.c
Данная программа является фактически "шпаргалкой" по функции форматного вывода данных на экран printf()
. Первым аргументом этой функции всегда должна следовать форматная строка - набор символов, заключённых в двойные кавычки ""
. В форматной строке могут встречаться спецификаторы вывода - сочетания символов вида %X
, где X
- буква, обозначающая представление, в котором в данном месте строки должен выводиться соответствующий аргумент функции printf()
. Более подробно этот материал также рассмотрен в лекциях, дополнительно можно ознакомиться с соответствующими материалами по книге K&R C. Кроме того, исчерпывающую информацию можно получить в справочной системе:
$ man 3 printf
После того как текст программы написан, её следует транслировать и запустить на исполнение:
$ gcc types.c -o types
$ ./types
0
(причём 0.0
- это не то же самое. Самостоятельно подумайте почему это так?). Нулевой адрес обозначается константой NULL
, а каждая строка в Си неявно заканчивается нулём, обычно записываемом в виде '\0'
.
Замечание. Обратите внимание на то, что символ нуля '0'
и сам нуль - это не одно и то же!
Все сказанное иллюстрирует следующая программа:
$ vim null.c
Как и всегда до этого, после набора программы её следует транслировать, при необходимости исправить ошибки и запустить, внимательно разобравшись с результатами её работы:
$ gcc null.c -o null
$ ./null
$ vim digit_systems.c
$ gcc digit_systems.c -o digit_systems
$ ./digit_systems
Данный пример иллюстрирует возможность гибко настраивать формат вывода данных с помощью спецификаторов вывода. Внимательно изучите результат работы программы и в случае появления вопросов обратитесь к преподавателю.
[]
. В языке Си предпологается, что каждая строка неявно завершается нулём - признаком окончания строки. Имя массива - это адрес её первого элемента.
$ vim strings.c
$ gcc strings.c -o strings
$ ./strings
Что такое sizeof()
? Объясните, почему вторая строка отобразилась именно так? Почему размеры строк именно такие? Попробуйте изменить второй вызов функции printf()
на следующий:
printf("%s %d\n", string2+3, sizeof(string2));
после чего оттранслируйте программу ещё раз, запустите и объясните, что произошло.
scanf()
. Как и всегда, подробная теория рассмотрена в лекциях, либо доступна в книге K&R C и в справочной документации:
$ man scanf
Набираем текст программы, компилируем её и запускаем:
$ vim scanf.c
$ gcc scanf.c -o scanf
$ ./scanf
scanf()
. В отличии от функции printf()
аргументы функции scanf()
, следующие за форматной строкой должны быть адресами переменных, поэтому к именам переменных применяется операция взятия адреса &
.
$ vim scanf_error.c
Кроме того, можно отследить количество "правильно распознаных" фактических параметров функции, изучая значение, которое возвращает функция.
Скомпилируйте программу и запустите её несколько раз вводя данные корретно и некорректно:
$ gcc scanf_error.c -o scanf_error
$ ./scanf_error
Введите через пробел 3 целых числа x, y, z: 1 2 3
Количество правильно обработанных аргументов - 3
Переменные x, y, z приняли значения: 1, 2, 3
$ ./scanf_error
Введите через пробел 3 целых числа x, y, z: 1 2 a
...
$ ./scanf_error
Введите через пробел 3 целых числа x, y, z: 1 3.4 7
...
Объясните поведение программы в приведённых примерах.