Глиф Учебники

Урок 2. Переменные и типы данных

Курс «C#» · урок 2 из 10 · 5 минут чтения

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

Что такое переменная

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

C#
int age = 15;
double height = 1.72;
char letter = 'A';
bool ready = true;
string name = "Анна";

Console.WriteLine(age);
Console.WriteLine(height);
Console.WriteLine(letter);
Console.WriteLine(ready);
Console.WriteLine(name);

age = 16;
Console.WriteLine(age);
Вывод
15
1,72
A
True
Анна
16

Запись int age = 15; читается так: «переменная age типа int со значением 15». Строка age = 16; кладёт в ту же переменную новое значение — тип при этом указывать не нужно. Логическое значение печатается словом True или False с большой буквы.

int age = 15; тип имя значение age int 15 тип задан при объявлении age = 16; тип уже не пишут age int 15 16 старое значение стёрто "Анна" это не int
Переменная — ячейка с именем и типом: новое значение заменяет в ней старое, а значение другого типа, например строку, в ячейку int не положить.

Дробные числа: точка в коде, запятая на экране

В коде дробная часть всегда отделяется точкой: 1.72. А на экран C# выводит число по региональным настройкам компьютера: в русской или белорусской Windows — с запятой (1,72), в английской — с точкой (1.72). То же и при вводе: с русскими настройками double.Parse ждёт запятую. Как с этим работать, рассказывают справки Как перевести строку в число и Как вывести число с двумя знаками после запятой.

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

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

ТипЧто хранитПример
intцелое число от −2 147 483 648 до 2 147 483 647int count = 42;
longбольшое целое, примерно до 9,2·10¹⁸long big = 10000000000;
doubleдробное число, около 15–16 верных цифрdouble pi = 3.14159;
decimalточное десятичное дробное, для денегdecimal price = 19.99m;
booltrue или falsebool ok = false;
charодин символ в одинарных кавычкахchar c = 'я';
stringстрока текста в двойных кавычкахstring city = "Минск";

Число с точкой без буквы в конце — это double. Для decimal в конце пишут букву m (19.99m), для float (дробное с меньшей точностью) — f, для long — L.

Целые числа и деление

Действия с числами: +, -, *, / и % (остаток от деления). Главная ловушка — деление: если оба числа целые, результат тоже целый, дробная часть отбрасывается.

C#
Console.WriteLine(7 / 2);
Console.WriteLine(7 % 2);
Console.WriteLine(7.0 / 2);
Console.WriteLine(-7 / 2);
Console.WriteLine(-7 % 2);
Вывод
3
1
3,5
-3
-1

Дробная часть отбрасывается «к нулю»: -7 / 2 — это -3, а не -4. Знак остатка совпадает со знаком делимого.

7 / 2 3 целых в каждой части 7 % 2 1 остаток 7.0 / 2 3,5 дробное деление дробная часть отбрасывается к нулю -7 / 2 → -3 7 / 2 → 3 −3,5 3,5 −4 −3 −2 −1 0 1 2 3 4
Деление целых 7 / 2 даёт 3 и остаток 1, деление 7.0 / 2 — дробное 3,5, а дробная часть у целого деления отбрасывается в сторону нуля: −3,5 становится −3, 3,5 — 3.

Чтобы поделить две целые переменные с дробным результатом, одну из них переводят в double — это приведение типа, тип пишется в скобках перед значением:

C#
int a = 7;
int b = 2;
double half = (double)a / b;
int whole = (int)3.99;
Console.WriteLine(half);
Console.WriteLine(whole);
Вывод
3,5
3

Приведение (int) просто отбрасывает дробную часть, а не округляет: (int)3.99 — это 3. Округление — в справке Как округлить число.

Сокращённые записи: x += 5 значит x = x + 5, так же работают -=, *=, /=, %=. x++ увеличивает переменную на единицу, x-- — уменьшает.

Почему 0,1 + 0,2 не равно 0,3

double хранит число в двоичном виде, и большинство десятичных дробей в нём — приближённые. Для расчётов это неважно, для денег — плохо. Там берут decimal: он хранит десятичные цифры точно.

C#
double d = 0.1 + 0.2;
decimal m = 0.1m + 0.2m;
Console.WriteLine(d);
Console.WriteLine(m);
Вывод
0,30000000000000004
0,3

Переполнение

У каждого целого типа есть предел. Если его перешагнуть, значение молча «перескакивает» на другой конец диапазона:

C#
int big = int.MaxValue;
Console.WriteLine(big);
big = big + 1;
Console.WriteLine(big);
long ok = int.MaxValue + 1L;
Console.WriteLine(ok);
Вывод
2147483647
-2147483648
2147483648

int.MaxValue — самое большое int. Если числа могут выйти за 2 миллиарда (произведения, суммы большого количества чисел, факториалы), берите long.

var и const

var просит компилятор самому определить тип по начальному значению:

C#
var count = 10;
var price = 9.99;
var title = "C#";

Здесь count — int, price — double, title — string. Тип всё равно есть и не меняется: после var count = 10; записать в count строку нельзя. Без начального значения var не работает: var x; даёт ошибку.

const делает значение неизменным — компилятор не даст его поменять:

C#
const int DaysInWeek = 7;
const double Gravity = 9.81;

Имена переменных

Имя состоит из букв, цифр и знака _ и не может начинаться с цифры: sum, maxValue, x2. Большие и маленькие буквы различаются: Sum и sum — разные переменные. Служебные слова языка (int, class, return) именами быть не могут. В C# принято называть переменные с маленькой буквы, а каждое следующее слово — с большой: studentCount, totalPrice. Русские буквы в именах компилятор допускает, но так не пишут.

Строки и числа вместе

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

C#
Console.WriteLine("Сумма: " + 2 + 3);
Console.WriteLine("Сумма: " + (2 + 3));
Console.WriteLine(2 + 3 + " — сумма");
Вывод
Сумма: 23
Сумма: 5
5 — сумма

В первой строке к тексту приклеивается 2, потом 3. Во второй скобки сначала считают 5. В третьей сначала складываются два числа, а потом результат склеивается с текстом. Удобнее всего — интерполяция строк из следующего урока: $"Сумма: {2 + 3}".

код, первое действие в рамке после первого шага на экране "Сумма: " + 2 + 3 "Сумма: 2" + 3 Сумма: 23 "Сумма: " + (2 + 3) "Сумма: " + 5 Сумма: 5 2 + 3 + " — сумма" 5 + " — сумма" 5 — сумма слева направо: число + число — сумма, строка + число — склейка в строку
Знак + считается слева направо, поэтому от скобок и порядка зависит, сложатся ли 2 и 3 до того, как попадут в строку.

Частые ошибки

Коротко

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

1. Что выведет Console.WriteLine(9 / 4);?
2. Какой тип лучше подходит для суммы денег в рублях с копейками?
3. Что выведет Console.WriteLine("Итого: " + 1 + 2);?
4. Какой тип получит переменная в строке var x = 2.5;?