Урок 2. Переменные и типы данных
Программа из первого урока всегда печатает одно и то же. Чтобы она что-то считала, ей нужно где-то хранить числа и текст. Для этого есть переменные.
Что такое переменная
Переменная — именованное место в памяти, где лежит значение. У каждой переменной в 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 с большой буквы.
Дробные числа: точка в коде, запятая на экране
В коде дробная часть всегда отделяется точкой: 1.72. А на экран C# выводит число по региональным настройкам компьютера: в русской или белорусской Windows — с запятой (1,72), в английской — с точкой (1.72). То же и при вводе: с русскими настройками double.Parse ждёт запятую. Как с этим работать, рассказывают справки Как перевести строку в число и Как вывести число с двумя знаками после запятой.
Здесь и дальше в курсе дробные числа в выводе показаны так, как их печатает компьютер с русскими региональными настройками, — через запятую.
Основные типы
| Тип | Что хранит | Пример |
|---|---|---|
int | целое число от −2 147 483 648 до 2 147 483 647 | int count = 42; |
long | большое целое, примерно до 9,2·10¹⁸ | long big = 10000000000; |
double | дробное число, около 15–16 верных цифр | double pi = 3.14159; |
decimal | точное десятичное дробное, для денег | decimal price = 19.99m; |
bool | true или false | bool ok = false; |
char | один символ в одинарных кавычках | char c = 'я'; |
string | строка текста в двойных кавычках | string city = "Минск"; |
Число с точкой без буквы в конце — это double. Для decimal в конце пишут букву m (19.99m), для float (дробное с меньшей точностью) — f, для long — L.
Целые числа и деление
Действия с числами: +, -, *, / и % (остаток от деления). Главная ловушка — деление: если оба числа целые, результат тоже целый, дробная часть отбрасывается.
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. Знак остатка совпадает со знаком делимого.
Чтобы поделить две целые переменные с дробным результатом, одну из них переводят в double — это приведение типа, тип пишется в скобках перед значением:
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: он хранит десятичные цифры точно.
double d = 0.1 + 0.2;
decimal m = 0.1m + 0.2m;
Console.WriteLine(d);
Console.WriteLine(m);0,30000000000000004
0,3Переполнение
У каждого целого типа есть предел. Если его перешагнуть, значение молча «перескакивает» на другой конец диапазона:
int big = int.MaxValue;
Console.WriteLine(big);
big = big + 1;
Console.WriteLine(big);
long ok = int.MaxValue + 1L;
Console.WriteLine(ok);2147483647
-2147483648
2147483648int.MaxValue — самое большое int. Если числа могут выйти за 2 миллиарда (произведения, суммы большого количества чисел, факториалы), берите long.
var и const
var просит компилятор самому определить тип по начальному значению:
var count = 10;
var price = 9.99;
var title = "C#";Здесь count — int, price — double, title — string. Тип всё равно есть и не меняется: после var count = 10; записать в count строку нельзя. Без начального значения var не работает: var x; даёт ошибку.
const делает значение неизменным — компилятор не даст его поменять:
const int DaysInWeek = 7;
const double Gravity = 9.81;Имена переменных
Имя состоит из букв, цифр и знака _ и не может начинаться с цифры: sum, maxValue, x2. Большие и маленькие буквы различаются: Sum и sum — разные переменные. Служебные слова языка (int, class, return) именами быть не могут. В C# принято называть переменные с маленькой буквы, а каждое следующее слово — с большой: studentCount, totalPrice. Русские буквы в именах компилятор допускает, но так не пишут.
Строки и числа вместе
Знак + между строкой и числом не складывает, а склеивает. Действия идут слева направо, поэтому скобки меняют результат:
Console.WriteLine("Сумма: " + 2 + 3);
Console.WriteLine("Сумма: " + (2 + 3));
Console.WriteLine(2 + 3 + " — сумма");Сумма: 23
Сумма: 5
5 — суммаВ первой строке к тексту приклеивается 2, потом 3. Во второй скобки сначала считают 5. В третьей сначала складываются два числа, а потом результат склеивается с текстом. Удобнее всего — интерполяция строк из следующего урока: $"Сумма: {2 + 3}".
Частые ошибки
Use of unassigned local variable(CS0165) — переменную читают раньше, чем положили в неё значение. C# такого не допускает: задайте значение при объявлении.Cannot implicitly convert type 'double' to 'int'(CS0266) — дробное значение кладут в целую переменную. Возьмитеdoubleили приведите явно:(int)x, помня, что дробная часть пропадёт.Cannot implicitly convert type 'string' to 'int'(CS0029) — строку"5"кладут вint. Строку в число переводитint.Parse("5")— подробно в справке Как перевести строку в число.5 / 2ждут2.5, а получают2— целочисленное деление.- Запятая в дробном числе в коде:
1,5— ошибка; пишется1.5.
Коротко
- Переменная объявляется с типом:
int n = 5;, тип потом не меняется;varвыводит тип из значения. - Целые —
intиlong, дробные —doubleи точныйdecimal(с буквойm), ещёbool,char,string. - Деление двух целых отбрасывает дробную часть,
%— остаток. - В коде дробная часть — через точку, а на экран число выводится по настройкам компьютера: в русских — через запятую.
+со строкой склеивает:"a" + 2 + 3— это"a23".