1.5. Переменные

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

int i = 10; 
short j = 20; 
bool b = false; 
unsigned long l = 123123; 
double x = 13.5 , y = 3.1415; 
float z; 

В языке C++ есть две похожие концепции, которые новички часто путают: присваивание и инициализация. После объявления переменной, ей можно присвоить значение с помощью оператора присваивания (знак равенства =):

int a; // это объявление переменной
a = 8; // а это присваивание переменной a значения 8

В языке C++ вы можете объявить переменную и присвоить ей значение одновременно. Это называется инициализацией (или «определением»).

int a = 8; // инициализируем переменную a значением 8

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

Правило: Если у вас изначально имеется значение для переменной, то используйте инициализацию, вместо присваивания.

Неинициализированные переменные

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

#include <iostream>
using namespace std;
 
int main()
{
    int a;
    cout << a; 
    return 0;
}

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

Правило: Убедитесь, что все ваши переменные в программе имеют значения (либо через инициализацию, либо через операцию присваивания).

Операции

Над переменными можно проводить операции:

  • Присваивания (=)
  • Арифметические:
    1. бинарные: + - * / % (оператор взяти остатка от деления)
    2. унарные: ++ – - инкремерт и декремент.
    3. сокращенные версии бинарных операторов: *+= = -= /= %=
  • Логические:
    1. бинрные: && ||
    2. унарные: !
  • Сравнения: == != < > <= >=
  • Приведения типов: (type)

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

#include <iostream>
using namespace std;

int main()
{
    int i = 10; 
    i = (20 * 3) % 7; // остаток от деления 60 на 7 есть 4
    cout << "i is " << i << endl;

    /* "постфиксная" версия унарного оператора - 
    в начале будет присвоено значение 4 в k, а затем i увеличится на 1 и станет 5*/
    int k = i++; 
    cout << "k is " << k << endl;
    /* "префиксная" версия унарного оператора - 
    в начале будет уменьшино значение i на единицу до 4,
    потом это значение (4) будет присвоено значение в l*/
    int l = --i; 
    cout << "l is " << l << endl;

    // k равен l, что вернет true, но инверсия превразает в false (0)
    bool b = !(k == l); 
    cout << "b initialized as " << b << endl;
    
    double a = 0.1;
    /* переприсваивание b.
    В выражении дизъюнкция, потому компилатор не будет выполнять другие выражения с права,
    если слева встретилось выражение дающее true.
    В данном случае ни первое выражение, ни ни второе не дают true
    */
    b = (a == 0) || (1 / a < 1); 
    cout << "b still " << b << endl;

    double d = 3.1415; 
    // идет приведение к целочисленному и записью целового значение в float
    float f = (int) d; 
    cout << "float contains " << f << endl;
    
    d *= i + k ; // аналогично d = d * (i + k)  = 3.1415 * 8
    cout << "d should equal to " << d << endl;
    return 0;
}