Урок №28. Инициализация, присваивание и объявление переменных

Данный учебный материал представляет собой более подробное развитие темы, затронутой в уроке номер 10.
Адреса и переменные
Как вы уже знаете, переменные представляют собой имена для участков памяти, в которых хранится информация. Важно помнить, что компьютеры обладают оперативной памятью, которая доступна программам для работы. При определении переменной выделяется определенная часть этой памяти для ее использования.
Минимальной единицей хранения информации является бит (от англ. "binary digit"), который может принимать значение 0 или 1. Можно представить себе бит как выключатель света - либо свет горит (1), либо нет (0). Нет никакого промежуточного состояния. Если мы взглянем на случайный участок памяти, то увидим последовательность 011010100101010 или что-то подобное. Память разделена на последовательные части, каждая из которых имеет свой адрес. Как мы используем адреса в реальной жизни, чтобы найти определенный дом на улице, так и здесь адреса помогают найти и получить доступ к содержимому, находящемуся в определенном месте памяти. Удивительно, но в современных компьютерах у каждого бита нет собственного адреса. Минимальной единицей с адресом является байт (состоящий из 8 битов).
Поскольку все информация на компьютере представлена в виде битовой последовательности, мы используем концепцию типов данных (или просто "типы") для указания компилятору, как правильно интерпретировать содержимое памяти. Примером типа данных является int (целочисленный тип). При объявлении переменной типа int мы говорим компилятору, что "определенный участок памяти по указанному адресу должен рассматриваться как целое число".
При указании типа данных для переменной, компилятор и процессор автоматически обрабатывают процесс преобразования значения в соответствующую последовательность бит определенного типа данных. При запросе значения обратно, оно восстанавливается из этой же последовательности бит.
Помимо типа данных int, в языке программирования C++ существует множество других типов данных, которые мы подробно изучим на соответствующих уроках.
Фундаментальные типы данных в С++
В C++ имеется встроенная поддержка различных типов данных, которые известны как основные (или "фундаментальные/базовые/встроенные типы данных").
Ниже приведен перечень основных типов данных в языке программирования C++:

Объявление переменных
Вы уже осведомлены о том, как можно объявить переменную типа целое число:
int nVarName ; // int - это тип, а nVarName - это имя переменной
Принцип объявления переменных других типов аналогичен следующему:
type varName ; // type - это тип (например, int), а varName - это имя переменной
Создание пяти переменных различных типов данных:
bool bValue ;
char chValue ;
int nValue ;
float fValue ;
double dValue ;
Обратите внимание, в данном случае отсутствует переменная типа void (подробнее о типе void мы рассмотрим на следующем занятии).
void vValue ; // не будет работать, так как void не может использоваться в качестве типа переменной
Инициализация переменных
При создании переменной мы можем сразу же присвоить ей значение. Этот процесс называется инициализацией переменной.
Существует два основных способа инициализации переменных в языке программирования C++.
Первый метод: Инициализация путем копирования (также известная как "копирование инициализации") с использованием знака равенства = :
int nValue = 5 ; // копирующая инициализация
Второй метод: Прямое задание с использованием круглых скобок () :
int nValue ( 5 ) ; // прямая инициализация
Лучше всего использовать прямую инициализацию с определенными типами данных, в то время как копирующая инициализация подходит для других.
uniform-инициализация
Прямая или копирующая инициализация не подходит для всех типов данных (например, нельзя использовать эти методы для инициализации массива значений).
Для обеспечения универсального механизма инициализации всех типов данных в C++11 был введен новый метод, известный как uniform-инициализация:
int value { 5 } ;
Использование пустых фигурных скобок для инициализации переменной подразумевает установку значения по умолчанию (в данном случае переменной присваивается 0):
int value { } ; // инициализация переменной по умолчанию значением 0 (ноль)
Uniform initialization has another additional advantage: you cannot assign a value to a variable that does not support its data type - the compiler will issue a warning or error message. For example:
int value { 4.5 } ; // ошибка: целочисленная переменная не может содержать нецелочисленные значения
Рекомендация: Пользуйтесь uniform-инициализацией.
Присваивание переменных
Если значение переменной устанавливается после её объявления, а не в момент объявления, то это называется копирующим присваиванием (или просто "присваиванием"):
int nValue ;
nValue = 5 ; // копирующее присваивание
В C++ отсутствует встроенная поддержка прямого/uniform-присваивания, доступно только копирование значений.
Объявление нескольких переменных
Возможно объявить несколько переменных одного типа данных в одном операторе, разделяя их имена запятыми. Например, следующие два отрывка кода выполняют одно и то же действие:
int a , b ;
И таким образом:
int a ;
int b ;
Также возможно инициализировать несколько переменных в одной строке:
int a = 5 , b = 6 ;
int c ( 7 ) , d ( 8 ) ;
int e { 9 } , f { 10 } ;
При объявлении нескольких переменных в одном операторе, новички часто допускают 3 ошибки:
Ошибочное действие №1: Присвоение одного и того же типа данных каждой переменной при объявлении нескольких переменных в одном операторе. Это несущественная ошибка, поскольку компилятор легко ее обнаружит и уведомит вас об этом:
int a , int b ; // неправильно (ошибка компиляции)
int a , b ; // правильно
Вторая ошибка: смешивание различных типов данных в одном операторе. Переменные разных типов должны быть объявлены в разных операторах. Компилятор также легко обнаружит эту ошибку:
int a , double b ; // неправильно (ошибка компиляции)
int a ; double b ; // правильно (но не рекомендуется)
// Правильно и рекомендуется (+ читабельнее)
int a ;
double b ;
Третья ошибка: Использование одной операции для инициализации двух переменных:
int a , b = 5 ; // неправильно (переменная a остаётся неинициализированной)
int a = 5 , b = 5 ; // правильно
Эффективный метод запомнить данную ошибку и избежать ее в последующем — применять прямую или равномерную инициализацию:
Объявлены переменные a и b, присвоено значение 5 переменной b.
Объявлены переменные c и d, которые инициализированы значением 5.
Данный пример наглядно демонстрирует, что число 5 присваивается только переменным b и d.
Инициализация нескольких переменных в одной строке может привести к ошибкам, поэтому я советую определять несколько переменных в одной строке только в том случае, если вы намерены инициализировать каждую из них.
Рекомендация: Если вы не планируете инициализировать каждую переменную, лучше избегать объявления нескольких переменных в одной строке.
Где объявлять переменные?
Ранее выпущенные версии компиляторов языка Си требовали, чтобы пользователи объявляли все переменные в начале функции:
В настоящее время это утверждение утратило свою актуальность. Современные компиляторы не требуют, чтобы все переменные были обязательно объявлены в самом начале функции. В языке C++ приоритет отдается объявлению (а также инициализации) переменных как можно ближе к их первому использованию:
Есть несколько плюсов в использовании такого подхода к написанию кода:
Чаще всего, вы можете создать переменную прямо перед её первым использованием. Однако иногда возникают ситуации, когда это нецелесообразно (в целях оптимизации производительности) или невозможно. Более подробно об этом мы рассмотрим в следующих уроках.
Следует придерживаться правила: объявляйте переменные как можно ближе к месту их первого использования.
Comments