Отправляет email-рассылки с помощью сервиса Sendsay

Си/Си++ с нуля!

  Все выпуски  

Си/Си++ с нуля!


Доброго времени суток, Уважаемые Подписчики.

Сначала коротко об изменениях и дополнениях на сайте. Для всех подписчиков добавил новыйраздел к форуму, для программистов на Си/С++, общайтесь, обменивайтесь опытом, задавайте вопросы! С переводом интерфейса правда пока как всегда туго :( тк времени не хватает катастрофически. Но работа над этим хоть медленно, но верно движется.

Еще одно дополнение связанно, с опросником. Для того чтобы оценить степень вашей подготовленности и знать как мне строить последующие выпуски на главной страничке сайта, справа внизу есть небольшой вопрос и один из четырех вариантов ответа, очень прошу всех ответить, это не отнимет у вас много времени, однако поможет мне сделать выпуски более качественными и информативными, а значит и более полезными для вас.

Об этом все, теперь приступим к главному.

Прежде всего небольшая поправка к предыдущему выпуску. Внимательный читатель мог заметить, что строка
void main(int argc, char argv)
отличается от той которую предлагает наша IDE когда сама создает шаблон программы. Там эта строка имеет вид
int main(int argc, char *argv[]),
Dev-Cpp конечно права и в статье на сайте я эту опечатку исправил, но для того чтобы и нам самим понимать в чем дело, в этом выпуске мы поговорим подробнее о переменных и их типах.

Вот для начала определение переменной взятое с сайта wikipedia.org:

Переменная в традиционных языках программирования — поименованная либо адресуемая иным способом область памяти, имя или адрес которой можно использовать для осуществления доступа к данным, находящимся в переменной (по данному адресу).

Загадочное может быть для кого-то выражение "область памяти" означает нечто, в чем можно что-то хранить. Мельчайший кусок памяти к которому можно получить доступ принято называть ячейкой, совокупность ячеек и образует область памяти. В программировании считают, что в памяти хранятся числа и каждой ячейке соответствует определенный номер, называемый адресом. Но по номерам-адресам обращаться к ней крайне неудобно, попробуйте запомнить, к примеру, несколько восми-значных чисел? Поэтому, чтобы мы могли легко отличать друг от друга эти области, мы каждой из них даем уникальное имя - метку, которую нам легко запомнить.

Непосредственно из данного определения напрашивается вывод, что переменная должна также иметь следующие характеристики:

  • Имя (или правильнее сказать идентификатор)
  • Что-то, что позволит интерпретировать содержимое переменной (те данные которые она содержит)
  • Что-то, что будет указывать на размер области памяти выделяемой под переменную, начало-то мы пометили, а где конец этой области?

Последние два пункта взаимозависимы и называются типом переменной.

Однако типизация используется не во всех языках программирования. Например в Си мы должны обязательно указать тип переменной перед первым использованием, а в PHP или Perl этого делать неаобязательно. Однако даже там есть возможность явно указать тип для переменной. Такие языки как Perl и PHP называются языками с неявной типизацией (динамической типизацией в терминологии wikipedia).А такие как Си/Си++, Паскаль - языками с явной типизацией (статической типизацией). Слова статическая и динамическая типизация говорят также о том, что в первом случае тип переменной уже известен в момент компиляции программы, а во втором он становится известен только на этапе выполнения программы. Естественно получается, что программы написанные на таких языках более ресурсоемки и требуют больше процессорного времени для выполнения.

Возникает вопрос, а какие типы данных бывают? Ответ на него достаточно сложен, но краток - любые. Но все они делятся на две категории, первые называются встроенными типами данных - это наиболее употребительные типы, так сказать кирпичики, а вторые - типы данных определяемые пользователем, они как раз и строятся из этих кирпичиков. Во втором случае это значит, что программист сам в процессе написания программы создает новый тип на основе встроенных типов. О пользовательских типах мы еще будем много говорить, а на первой категории уже сейчас остановимся подробнее.

В языке Си, про типы данных в других языках я говорить не буду, скажу только, что они везде очень похожи. Так вот в Си встроенных типов не так-то много, приведу их все в табличке. Внимание(!) указанные в ней размеры типов, могут быть другими на процессорах не относящихся к семейству IA32 (однако я так предполагаю, что у вас нет таких раритетов).

НаименованиеРазмер (байт)Диапазон значений(знаковый/беззнаковый)Описание
void 0 0 "Пустой" используется для указания типа функции, которая не должна возвращать никакого значения. Является особенностью Си++, в других каких-либо языках я его не встречал.
bool 1/8 0 или 1 Логический тип, может принимать одно из двух значений истина либо ложь (true, false), ноль или единица, если в числовом эквиваленте. Тоже особенность Си++ (в классическом Си его нет), однако присутствует и во многих других языках.
char 1 0-255 или (-128)-(+127) "Символьный тип", используется в основном для хранения символов, значения - всегда целые числа.
short 2 0-65535 или (-32768)-(+32767) Так называемое короткое целое. Значения переменной такого типа всегда целые числа. Стандарт Си не устанавливает конкретных размеров для типов short и long.
int 4 0-4294967295 или (-2147483648)-(+2147483647) Целочисленный тип. Значения переменной такого типа всегда целые числа. Все действия с элементами типа int производятся максимально быстро. Всегда следует выбирать именно тип int, если использование других целочисленных типов не диктуется явно спецификой решаемой задачи.
long 4 0-4294967295 или (-2147483648)-(+2147483647) Длинное целое. На самом деле на процессоре c архитектурой IA32, равносилен типу int.
float 4 - "Дробный" тип, значения переменной такого типа всегда дробные. Вообще в программировании такие числа называются числами с плавающей запятой. Тут правда важен один момент: в Си и других (как правило забугорных) языках в качестве отделения целой части от десятичной используется не запятая, а точка. Это важно помнить!
double 8 - Числа с плавающей запятой удвоенной точности. Тоесть диапазон значений переменных данного типа ровно в два раза больше чем у переменных типа float. Тип double является основным для компьютеров с архитектурой IA32. Тип float - это, скорее, атавизм, оставшийся от ранних версий языка Си.

Для чисел с плавающей запятой я сознательно не стал указывать пределы, так как эти пределы тоже плавают, более подробно об этих числах вы можете узнать здесь.

Для целых чисел существует также дополнительный модификатор unsigned, он указывает на то, что переменная использует только положительные числа, смещая диапазон допустимых значений переменной в сторону положительных чисел.

Адрес поименованной ячейки памяти, также может определяться как на этапе компиляции, так и во время выполнения программы. По времени создания переменные бывают статическими и динамическими. Первые, создаются в момент запуска программы или подпрограммы, а вторые создаются в процессе выполнения программы. Мы пока будем пользоваться статическими переменными, про динамические будет отдельный выпуск.

Имя переменной в Си (и многих других языках программирования) может быть практически любым, за исключением некоторых слов называемых ключевыми(к ключевым словам в частности относятся все идентификаторы типов), а также слов которые являются зарезервированными. Кроме того оно должно быть уникальным для каждой переменной, иначе как мы определим к какой области памяти оно относится? Каждой переменной желательно давать осмысленные имена в зависимости от назначения этой переменной, так например если она хранит инфоормацию об имени некоторого субъекта, то вполне логично будет назвать ее name. Имена переменных обычно должны записываться на латинице, в очень немногих языках программирования допускаются исключения.

Как добавить переменную в программу? Сделать это довольно просто, написав к примеру что-то типа:
int myvar = 16384;
в некотором месте нащей программы мы скажем компилятору о том чтобы он зарезервировал 8 байт памяти под переменную myvar (обратите внимание на точку с запятой), и записал в этот участок значение 16384. Позже мы можем вызвать такую функцию как
printf("%d", myvar);
Видите - используем переменную myvar среди ее параметров? Она напечатает нам значение этой переменной на экран. Можете попробовать изменить вашу программу из прошлого выпуска, чтобы проверить как это все работает в качестве домашнего задания.

Ну вот, на сегодня мне кажется более чем достаточно! В следующий раз я покажу вам еще одну небольшую программу, а затем мы подробно разберем, что такое функция и ее параметры.


С уважением, Владимир Чистов - ведущий рассылки.
До встречи в следующем выпуске!

Если у вас возникли какие-нибудь вопросы, обязательно пишите мне или заходите на сайт рассылки.


В избранное