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

Философия программирования на C++


Здравствуйте, уважаемые подписчики!

Начну с некоторых новостей. Найдены постоянные авторы рассылки, теперь рассылка возобновляется. Выпускаться она будет как и раньше, в тестовом режиме (формат рассылки может стать другим, возможна смена оформления - словом, будем экспериментировать). Кроме того, статьи будут теперь носить скорее "изучательный" характер, то есть больше внимания будет уделяться изучению основ языка С++. Естественно, мы будем стараться рассказывать не только об этом, а после пойдем и дальше... В общем, самые терпеливые все сами увидят :) Кроме того мы, надеемся на обратную связь, тогда нам будет понятно о чем следует рассказывать, а о что является излишним. Мы постараемся учесть все пожелания, поверьте, они важны нам. Еще также отметим, что мы будем пытаться выпускать рассылку чаще, чем один раз в неделю...

В данном выпуске я просто напомню, что было в предыдущем выпуске, и, может быть, слегка дополню.

Итак, в прошлом выпуске я рассказал о типах данных, ну и слегка о переменных. Сейчас коротко обо всем этом, как подведение итогов.

В С++ существует 4 основных типа данных: int (целочисленные значения, минимум 2 байта), char (тип для хранения символов, как правило, 1 байт), float (тип для хранения вещественных чисел с плавающей запятой с точностью до 7 знаков), double (то же самое, но с двойной точностью в 15-16 знаков). Их можно использовать для создания переменных: просто указываем тип переменной и после этого пишем ее имя (с помощью имени переменной к ней можно будет обращаться, из примеров должно быть все понятно).

Теперь насчет типа char. Он предназначен для хранения символов. Символы в нем хранятся в виде кода символа (1 байт, от 0 до 255) таблицы ASCII (на самом деле, это не столь важно, поэтому за подробностями отсылаю в интернет). Просто запомните, что каждому символу соответствует просто некоторое число (как правило, 1 байт). Для программирования на высоком уровне большего знать не нужно. Поэтому тип char можно использовать как простой целочисленный тип размером 1 байт. Символы в С++ записываются в апострофах (одинарных кавычках). Например, 'a' - символ (пример кода: char a = 's'; ). Также имеются и спецсимволы (о них будет рассказано позже), например, '\0' (они записываются в 2 символа и начинаются с символа \).

Теперь о числовых константах в С++. Любое целое число, которое вы запишите в редакторе, будет представлять собой тип int.  Пример кода: int a = 200; .

Вещественные числа записываются с точкой, например 3.141592. В таком виде все числа представляют собой тип double. Можно использовать в конце чисел символы, которые указывают компилятору что это за тип, но, как правило, это не используется в хорошо спроектированных программах (например, 3.1415926f - тип float).

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

#include "iostream"
using namespace std;
int main() {
    cout << sizeof(12) << endl;
    cout << sizeof(3.1415926) << endl;
    cout << sizeof(3.1415926f) << endl;
    cout << sizeof(1000000000000000000) << endl;    //Здесь компилятор сам определяет, что число не помещается в int и использует тип long long
}


Напомню, что, как правило, на 32-хразрядных системах тип int занимает 4 байта, double 8 байт, float 4 байта, long 8 байт.

А дальше следует пример использования переменных. Предварительно расскажу о присвоении значения переменной. Пусть имеется переменная с именем variable. Чтобы ей присвоить некоторое значение, в С++ пишется код:

variable = 10;


После выполнения этой строчки, в переменной variable будет храниться значение 10 (допустим, что тип переменной - целочисленный, т.е. int). Дальше код, в котором также имеются различные операции над числами. Сначала код, потом необходимые комментарии (то, что понятно на интуитивном уровне, я рассказывать не буду).

#include "iostream"
using namespace std;
int main() {
    int a = 10;    //Инициализируем переменную значением 10
    int b = 20;
    int c = a + b;
    cout << "c = " << c << endl;
    a = 20;    //Присваиваем переменной а значение 20
    cout << "a = " << a << endl;
    b = 100;
    double d = a*b + c;    //Здесь используется выражение, * означает умножение
    cout << "d = " << d << endl;
    double e = d / 100;    //Символ / означает деление, d делится на 100
    cout << "e = " << e << endl;
    double f = c / 100;    //!Результат будет 0! Целочисленное деление (результат без остатка)
    cout << "f = " << f << endl;
    b = b * a + c % 10;    //Справа можно использовать ту же переменную, в которую будет потом записано новое значение, % - деление по модулю
    cout << "b = " << b << endl;
    a = 2;
    b = 2;
    cout << a*b+2 << endl;
}


Тут все должно быть понятно, кроме, может быть, результата деления c на 100. В данном случае оба операнда деления являются целыми числами (оба типа int). Поэтому компилятор при делении выполняет целочисленное деление (то есть находит частное от деления, а остаток просто отбрасывает). Поэтому c / 100 будет равно 0 (в c находится значение 30, а 30/100 будет 0 и остаток 30). А чтобы найти остаток от деления, используется оператор % (называемый также делением по модулю). После этого уже результат компилятор приводит к типу double.

Ну приоритеты операций такие же, как в математике (2+2*2 = 6 :) ). Чтобы изменить приоритет операций, используют скобки ((2+2)*2 = 8). Тут следует обратить внимание на то, что если приоритет в каком-то случае является неочевидным, то лучше лишний раз написать скобки, чтобы не запутаться и не путать других программистов, читающих ваш код. Конечно, пока это не так необходимо, но дальше вы увидите ситуации, когда это действительно приводит к ошибкам.

Из приведенных программ в принципе можно понять, что такое переменная и так далее. Мы будем придерживаться такого курса: меньше теории, больше практики.

И коротенько расскажу о переполнении переменных. Это происходит тогда, когда результат превосходит максимально допустимое значение. Например, для типа short int (2 байта, целочисленный тип) значения могут быть в пределах от -32768 до 32767. Если попытаться записать в нее значение больше 32767, то произойдет переполнение, и в итоге в переменную будет записано совсем не то, что нужно. Следующий код поможет вам понять лучше, что же будет туда записано (грубо говоря если число будет выше 32767, то в результате будет это число минус k*2^16, где k - целое число такое, чтобы результат был в необходимых пределах).

#include "iostream"
using namespace std;
int main() {
    int a = 1;
    int b = 32767;
    short c = a + b;
    cout << "c = " << c << endl;
}


Советую поэкспериментировать с кодом, чтобы разобраться получше с этим.

Хоть эта тема и простая, но здесь имеется много подводных камней, и программисты страдают из-за своей невнимательности. Поэтому рекомендуется и опытным программистам все это вспомнить и не забывать при написании кода  :).

На сегодня все, все свои вопросы и комментарии вы можете присылать на почту asm_89@mail.ru

Удачи!


В избранное