Перейти к основному содержимому

Переменные и типы данных

Переменные разных типов связывают измерения датчиков с состоянием робота

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

Коротко

У переменной есть тип, имя и значение. Перед чтением переменной значение нужно задать. Не полагайтесь на случайное начальное содержимое памяти.

Простые переменные

#include <iostream>
using namespace std;

int main() {
int speed = 80;
int dist = 25;

cout << speed << endl;
cout << dist << endl;
return 0;
}

Знак = в объявлении задаёт начальное значение. В первых уроках используем именно такую запись: она привычна и легко читается.

Основные типы

Размеры и точные диапазоны зависят от платформы, но для первого понимания удобно держать в голове такую таблицу:

ТипЧто хранитЧастый размерПримерный диапазон значенийПример
intцелые числаобычно 4 байта на ПК, иногда 2 байта на микроконтроллерепри 4 байтах: от -2147483648 до 2147483647; при 2 байтах: от -32768 до 32767int x = 10;
unsigned intцелые числа без минусаобычно 4 байта на ПК, иногда 2 байта на микроконтроллерепри 4 байтах: от 0 до 4294967295; при 2 байтах: от 0 до 65535unsigned int count = 42;
long intбольшие целые числаобычно 4 или 8 байтпри 4 байтах: от -2147483648 до 2147483647; при 8 байтах: примерно от -9.22e18 до 9.22e18long int time = 1000;
unsigned long intбольшие целые числа без минусаобычно 4 или 8 байтпри 4 байтах: от 0 до 4294967295; при 8 байтах: от 0 до примерно 1.84e19unsigned long int ticks = 1000;
floatдробные числаобычно 4 байтапримерно от -3.4e38 до 3.4e38, но с ограниченной точностьюfloat volt = 4.7;
doubleболее точные дробные числаобычно 8 байт на ПКпримерно от -1.7e308 до 1.7e308, но с ограниченной точностьюdouble pi = 3.14;
charодин символ1 байтобычно от -128 до 127 или от 0 до 255, зависит от компилятораchar key = 'A';
boolистина или ложьобычно 1 байтtrue или falsebool ok = true;
stringстроку текстазависит от длины строкиограничен доступной памятьюstring name = "robot";

long и long int означают один и тот же тип. Для string обычно подключают заголовок <string>. На микроконтроллерах размеры могут отличаться. Если размер критичен, нужно смотреть документацию платы или проверять тип через sizeof.

Перед чтением задайте значение

Плохой пример:

#include <iostream>
using namespace std;

int main() {
int speed;
cout << speed << endl;
return 0;
}

Переменная speed создана, но значение ей не задано. На одном компьютере вы можете увидеть 0, на другом — случайное число. На микроконтроллере такая ошибка особенно неприятна: устройство может начать работать с мусорным значением.

Правильно:

#include <iostream>
using namespace std;

int main() {
int speed = 0;
cout << speed << endl;
return 0;
}

Изменение значения

#include <iostream>
using namespace std;

int main() {
int speed = 0;
cout << speed << endl;

speed = 50;
cout << speed << endl;

speed = speed + 10;
cout << speed << endl;
return 0;
}

Вывод:

0
50
60

В строке speed = speed + 10; правая часть сначала вычисляется, затем результат записывается обратно в переменную.

Математические операции

ОперацияЗаписьПример результата
сложениеa + b7 + 3 даёт 10
вычитаниеa - b7 - 3 даёт 4
умножениеa * b7 * 3 даёт 21
делениеa / b7 / 3 для int даёт 2
остатокa % b7 % 3 даёт 1

Пример:

#include <iostream>
using namespace std;

int main() {
int a = 7;
int b = 3;

cout << a + b << endl;
cout << a / b << endl;
cout << a % b << endl;
return 0;
}

Математические функции

Для некоторых вычислений подключают библиотеку cmath. Это отдельная тема, но самые частые функции полезно увидеть рано.

ФункцияЧто делаетПример
sqrt(x)квадратный кореньsqrt(25) даёт 5
pow(a, b)степеньpow(2, 3) даёт 8
abs(x)модуль числаabs(-7) даёт 7
round(x)округление до ближайшего целогоround(3.6) даёт 4
#include <iostream>
#include <cmath>
using namespace std;

int main() {
double x = 25;
cout << sqrt(x) << endl;
return 0;
}

Локальные и глобальные переменные

Переменная, созданная внутри main, называется локальной. Она доступна только внутри своих фигурных скобок.

#include <iostream>
using namespace std;

int speed = 10;

int main() {
int dist = 20;
cout << speed << endl;
cout << dist << endl;
return 0;
}

speed создана вне main, поэтому её называют глобальной. В первых программах лучше чаще использовать локальные переменные: их проще контролировать. Глобальные переменные удобны для простых настроек, но в больших программах из-за них сложнее понять, кто изменил значение.

Практика

  1. Создайте переменные speed, dist, time и задайте им значения.
  2. Выведите каждую переменную на отдельной строке.
  3. Посчитайте sum = speed + dist и выведите результат.
  4. Проверьте разницу между 7 / 3 и 7.0 / 3.0.
  5. Подключите cmath и выведите квадратный корень из 64.

Проверьте себя

  1. Из каких трёх частей состоит объявление переменной?
  2. Почему нельзя читать переменную до задания значения?
  3. Чем int отличается от double?
  4. Что делает операция %?
  5. Почему размеры типов могут отличаться на разных платах?
  6. Чем локальная переменная отличается от глобальной?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

ТерминЗначение
переменнаяименованное место для хранения значения
типправило для допустимых значений и операций
инициализациязадание первого значения
присваиваниезапись нового значения
локальная переменнаяпеременная внутри блока
глобальная переменнаяпеременная вне функций
байтединица размера памяти

Связанные темы

Источники