Переменные
Синтаксис объявления переменных в C# выглядит следующим образом:
int i;
Объявить можно переменную любого действительного типа. Важно подчеркнуть, что возможности переменной определяются ее типом. Например, переменную типа bool нельзя использовать для хранения числовых значений с плавающей точкой. Кроме того, тип переменной нельзя изменять в течение срока ее существования. В частности, переменную типа int нельзя преобразовать в переменную типа char.
Все переменные в C# должны быть объявлены до их применения. Это нужно для того, чтобы уведомить компилятор о типе данных, хранящихся в переменной, прежде чем он попытается правильно скомпилировать любой оператор, в котором используется переменная. Это позволяет также осуществлять строгий контроль типов в C#.
Инициализация переменной
Задать значение переменной можно, в частности, с помощью оператора присваивания. Кроме того, задать начальное значение переменной можно при ее объявлении. Для этого после имени переменной указывается знак равенства (=) и присваиваемое значение. Если две или более переменные одного и того же типа объявляются списком, разделяемым запятыми, то этим переменным можно задать, например, начальное значение. Ниже приведена общая форма инициализации переменной:
int i = 10; // задаем целочисленной переменной i значение 10 char symbol = 'Z'; // инициализируем переменную symbol буквенным значением Z float f = 15.7F; // переменная f инициализируется числовым значением 15.7 int x = 5, y = 10, z = 12; // инициализируем несколько переменных одного типа
Инициализация переменных демонстрирует пример обеспечения безопасности C#. Коротко говоря, компилятор C# требует, чтобы любая переменная была инициализирована некоторым начальным значением, прежде чем можно было обратиться к ней в какой-то операции. В большинстве современных компиляторов нарушение этого правила определяется и выдается соответствующее предупреждение, но «всевидящий» компилятор C# трактует такие нарушения как ошибки. Это предохраняет от нечаянного получения значений «мусора» из памяти, оставшегося там от других программ.
В C# используются два метода для обеспечения инициализации переменных перед пользованием:
- Переменные, являющиеся полями класса или структуры, если не инициализированы явно, по умолчанию обнуляются в момент создания.
- Переменные, локальные по отношению к методу, должны быть явно инициализированы в коде до появления любого оператора, в котором используются их значения. В данном случае при объявлении переменной ее инициализация не происходит автоматически, но компилятор проверит все возможные пути потока управления в методе и сообщит об ошибке, если обнаружит любую возможность использования значения этой локальной переменной до ее инициализации.
Например, в C# поступить следующим образом нельзя:
char (Справочник по C#)
Ключевое слово типа char — это псевдоним для типа структуры System.Char .NET, представляющий символ UTF-16 в Юникоде.
| Type | Диапазон | Размер | Тип .NET |
|---|---|---|---|
| char | От U+0000 до U+FFFF | 16 разрядов | System.Char |
Значение по умолчанию для типа char — \0 , то есть U+0000.
Тип char поддерживает сравнение, проверку равенства, а также операции инкремента и декремента. Кроме того, для операндов char арифметические и побитовые логические операторы выполняют операцию с соответствующими кодами символов и создают результат типа int .
Тип string представляет текст как последовательность значений char .
Литералы
Значение char можно указать следующим образом:
- символьный литерал;
- escape-последовательность Юникода, то есть символы \u , за которыми следует шестнадцатеричное представление кода символа из четырех символов;
- шестнадцатеричная escape-последовательность, то есть символы \x , за которыми следует шестнадцатеричное представление кода символа.
var chars = new[] < 'j', '\u006A', '\x006A', (char)106, >; Console.WriteLine(string.Join(" ", chars)); // output: j j j j
Как показано в предыдущем примере, можно также привести значение кода символа к соответствующему значению char .
В случае escape-последовательности Юникода необходимо указать все четыре шестнадцатеричные цифры. То есть \u006A — допустимая escape-последовательность, а \u06A и \u6A нет.
В случае шестнадцатеричной escape-последовательности начальные нули можно опустить. То есть \x006A , \x06A и \x6A — допустимые escape-последовательности, соответствующие одному символу.
Преобразования
Тип char неявно преобразуется в следующие целочисленные типы: ushort , int , uint , long и ulong . Он также может быть неявно преобразован во встроенные числовые типы с плавающей запятой: float , double и decimal . Он явно преобразуется в целочисленные типы sbyte , byte и short .
Неявные преобразования из других типов в тип char не предусмотрены. Но любой целочисленный тип или числовой тип с плавающей запятой явно преобразуется в char .
Спецификация языка C#
Дополнительные сведения см. в разделе Целочисленные типы в статье Спецификации языка C#.
См. также
- справочник по C#
- Типы значений
- Строки
- System.Text.Rune
- Кодировка символов в .NET
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Использование целочисленных чисел и чисел с плавающей запятой в C#
В этом руководстве описаны числовые типы в C#. Вы напишете небольшие фрагменты кода, затем скомпилируете и выполните этот код. Руководство содержит ряд уроков, в которых рассматриваются числа и математические операции в C#. В рамках этих занятий вы ознакомитесь с основами языка C#.
Чтобы вставить фрагмент кода в режим фокусировки , используйте сочетание клавиш ( CTRL + v или cmd + v ).
Предварительные требования
Для работы с руководством вам потребуется компьютер, настроенный для разработки в локальной среде. Инструкции по установке и общие сведения о разработке приложений в .NET см. в статье Настройка локальной среды .
Если вы не хотите настраивать локальную среду, ознакомьтесь с интерактивной версией этого руководства в браузере.
Вычисления с целыми числами
Создайте каталог с именем numbers-quickstart. Сделайте его текущим и выполните следующую команду:
dotnet new console -n NumbersInCSharp -o .
В шаблонах C# для .NET 6 используются операторы верхнего уровня. Приложение может не соответствовать коду, приведенному в этой статье, если вы уже выполнили обновление до .NET 6. Дополнительные сведения см. в статье Новые шаблоны C# для создания инструкций верхнего уровня.
Пакет SDK для .NET 6 также добавляет набор неявных global using директив для проектов, использующих следующие пакеты SDK:
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
Эти неявные директивы global using включают наиболее распространенные пространства имен для соответствующего типа проектов.
Откройте файл Program.cs в любом редакторе и замените содержимое файла следующим кодом:
int a = 18; int b = 6; int c = a + b; Console.WriteLine(c);
Чтобы выполнить этот код, введите dotnet run в окно командной строки.
Вы увидели одну из основных математических операций с целыми числами. Тип int представляет целое положительное или отрицательное число или ноль. Для сложения используйте символ + . Другие стандартные математические операции с целыми числами включают:
- — — вычитание;
- * — умножение;
- / — деление.
Начните с ознакомления с различными операциями. Добавьте следующие строки после строки, с помощью которой записывается значение c :
// subtraction c = a - b; Console.WriteLine(c); // multiplication c = a * b; Console.WriteLine(c); // division c = a / b; Console.WriteLine(c);
Чтобы выполнить этот код, введите dotnet run в окно командной строки.
Можно также поэкспериментировать, написав несколько математических операций в одной строке. Например, выполните c = a + b — 12 * 17; . Допускается сочетание переменных и постоянных чисел.
Вероятнее всего, при изучении C# (как и любого другого языка программирования) вы будете допускать ошибки в коде. Компилятор найдет эти ошибки и сообщит вам о них. Если результат содержит сообщения об ошибках, внимательно просмотрите пример кода и код в окне, чтобы понять, что нужно исправить. Это упражнение поможет вам изучить структуру кода C#.
Вы завершили первый этап. Прежде чем перейти к следующему разделу, переместим текущий код в отдельный метод. Метод — это последовательность инструкций, сгруппированных под одним именем. Чтобы вызвать метод, нужно указать имя метода и () после него. Упорядочение кода в методы упростит работу с новым примером. В результате ваш код должен выглядеть примерно следующим образом:
WorkWithIntegers(); void WorkWithIntegers() < int a = 18; int b = 6; int c = a + b; Console.WriteLine(c); // subtraction c = a - b; Console.WriteLine(c); // multiplication c = a * b; Console.WriteLine(c); // division c = a / b; Console.WriteLine(c); >
Строка WorkWithIntegers(); вызывает метод. Код после этой строки объявляет метод и определяет его.
Изучение порядка операций
Закомментируйте вызов WorkingWithIntegers() . Это поможет упорядочить выходные данные в этом разделе.
//WorkWithIntegers();
// запускает комментарий в C#. Комментарии — это любой текст, который должен быть сохранен в исходном коде, но не должен выполняться как код. Компилятор не создает исполняемый код из комментариев. Так как WorkWithIntegers() является методом, необходимо закомментировать только одну строку.
Язык C# определяет приоритет математических операций в соответствии с правилами математики. Умножение и деление имеют приоритет над сложением и вычитанием. Убедитесь в этом, добавив следующий код после вызова WorkWithIntegers() и выполнив dotnet run :
int a = 5; int b = 4; int c = 2; int d = a + b * c; Console.WriteLine(d);
В выходных данных видно, что умножение выполняется раньше сложения.
Можно применить другую последовательность операций. Для этого операции, которые должны выполняться первыми, нужно заключить в скобки. Добавьте приведенные ниже строки и выполните код еще раз.
d = (a + b) * c; Console.WriteLine(d);
Поэкспериментируйте, объединяя различные операции. Добавьте строки, как показано ниже. Выполните dotnet run еще раз.
d = (a + b) - 6 * c + (12 * 4) / 3 + 12; Console.WriteLine(d);
Возможно, вы заметили интересное поведение целых чисел. Деление целых чисел всегда дает результат в виде целого числа, даже если ожидаемый результат содержит десятичную или дробную часть.
Если вы еще не видели пример такого поведения, выполните следующий код:
int e = 7; int f = 4; int g = 3; int h = (e + f) / g; Console.WriteLine(h);
Выполните dotnet run еще раз, чтобы просмотреть результаты.
Прежде чем продолжить, давайте поместив весь код, который вы написали в этом разделе, в новый метод. Вызовите этот новый метод OrderPrecedence . Код должен выглядеть следующим образом:
// WorkWithIntegers(); OrderPrecedence(); void WorkWithIntegers() < int a = 18; int b = 6; int c = a + b; Console.WriteLine(c); // subtraction c = a - b; Console.WriteLine(c); // multiplication c = a * b; Console.WriteLine(c); // division c = a / b; Console.WriteLine(c); >void OrderPrecedence() < int a = 5; int b = 4; int c = 2; int d = a + b * c; Console.WriteLine(d); d = (a + b) * c; Console.WriteLine(d); d = (a + b) - 6 * c + (12 * 4) / 3 + 12; Console.WriteLine(d); int e = 7; int f = 4; int g = 3; int h = (e + f) / g; Console.WriteLine(h); >
Изучение точности и ограничений для целых чисел
В последнем примере вы увидели, что при делении целых чисел результат усекается. Вы можете получить остаток с помощью оператора остатка от деления, который обозначается символом % . Попробуйте выполнить следующий код после вызова метода OrderPrecedence() :
int a = 7; int b = 4; int c = 3; int d = (a + b) / c; int e = (a + b) % c; Console.WriteLine($"quotient: "); Console.WriteLine($"remainder: ");
Тип целых чисел C# характеризуется еще одним отличием от математических целых: тип int имеет минимальные и максимальные ограничения. Чтобы просмотреть эти ограничения, добавьте такой код:
int max = int.MaxValue; int min = int.MinValue; Console.WriteLine($"The range of integers is to ");
Если при вычислении выводится значение вне этих пределов, возникает условие потери значимости или переполнения. Ответ должен находиться в диапазоне от минимального до максимального значения. Добавьте следующие две строки, чтобы увидеть пример:
int what = max + 3; Console.WriteLine($"An example of overflow: ");
Обратите внимание, что ответ очень близок к минимальному целому числу (отрицательное значение). Он совпадает со значением min + 2 . Оператор сложения вызвал переполнение допустимых значений для целых чисел. Ответ является очень большим отрицательным числом, так как переполнение покрывает диапазон от наибольшего целого числа до наименьшего.
Существуют другие числовые типы с различными ограничениями и точностью, которые можно использовать, если тип int не соответствует вашим требованиям. Далее рассмотрим другие типы. Прежде чем перейти к следующему разделу, переместите код, написанный согласно инструкциям из этого раздела, в отдельный метод. Присвойте обработчику события имя TestLimits .
Работа с типом double
Числовой тип double представляет число с плавающей запятой двойной точности. Эти термины могут быть новыми для вас. Число с плавающей запятой можно использовать для представления нецелых чисел, которые могут быть очень большими или малыми. Число двойной точности — это относительный термин, описывающий количество двоичных разрядов, используемых для хранения значения. Числа двойной точности имеют в два раза больше двоичных символов по сравнению с числами одиночной точности. На современных компьютерах числа двойной точности используются чаще, чем одиночной. Числа одиночной точности объявляются с помощью ключевого слова float . Рассмотрим их. Добавьте следующий код и просмотрите результат:
double a = 5; double b = 4; double c = 2; double d = (a + b) / c; Console.WriteLine(d);
Обратите внимание, что ответ включает десятичную долю частного. Попробуйте более сложное выражение с типом double:
double e = 19; double f = 23; double g = 8; double h = (e + f) / g; Console.WriteLine(h);
Диапазон значений типа double гораздо больше, чем диапазон значений целых чисел. Добавьте следующий фрагмент после написанного кода:
double max = double.MaxValue; double min = double.MinValue; Console.WriteLine($"The range of double is to ");
Значения выводятся в экспоненциальном представлении. Число слева от символа E является значащим. Число справа — это показатель степени, который равен 10. Так же, как десятичные числа в математике, значения double в C# могут содержать ошибки округления. Выполните этот код:
double third = 1.0 / 3.0; Console.WriteLine(third);
Вы знаете, что 0.3 повторяющееся конечное число раз не совпадает с 1/3 .
Задача
Выполните другие вычисления с большими числами, малыми числами, умножением и делением с помощью типа double . Попробуйте выполнить более сложные вычисления. После того как вы решите сложную задачу, поместите написанный код в новый метод. Присвойте этому методу имя WorkWithDoubles .
Работа с десятичными типами
Вы уже ознакомились с базовыми числовыми типами в C# — целыми числами и числами типа double. Осталось изучить еще один тип: decimal . Тип decimal имеет меньший диапазон, но большую точность, чем double . Например:
decimal min = decimal.MinValue; decimal max = decimal.MaxValue; Console.WriteLine($"The range of the decimal type is to ");
Обратите внимание, что диапазон меньше, чем для типа double . Вы можете убедиться в повышении точности при использовании типа decimal, выполнив следующий код:
double a = 1.0; double b = 3.0; Console.WriteLine(a / b); decimal c = 1.0M; decimal d = 3.0M; Console.WriteLine(c / d);
Суффикс M возле чисел указывает, что для константы должен использоваться тип decimal . В противном случае компилятор предполагает тип double .
Буква M была выбрана потому, что визуально показывает различия между ключевыми словами double и decimal .
Обратите внимание, что при вычислении с использованием типа decimal справа от запятой содержится больше цифр.
Задача
Теперь, когда вы ознакомились с разными числовыми типами, напишите код, который позволяет вычислить площадь круга с радиусом 2,50 см. Помните, что площадь круга равна квадрату радиуса, умноженному на число пи. Подсказка: в .NET есть константа пи Math.PI, которую можно использовать. Math.PI, как и все константы, объявленные в пространстве имен System.Math , — это значение double . По этой причине вместо значений decimal для этой задачи следует использовать double .
Вы должны получить ответ от 19 до 20. Ответ можно просмотреть в готовом примере кода на GitHub.
При желании поэкспериментируйте с другими формулами.
Вы выполнили все задачи краткого руководства по числам в C#. Теперь вы можете выполнить руководство по ветвям и циклам в своей среде разработки.
Дополнительные сведения о числах в C# см. в следующих статьях:
- Целочисленные типы
- Числовые типы с плавающей запятой
- Встроенные числовые преобразования
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Консольный ввод/вывод и форматирование
В консольных приложениях не обойтись без методов класса Console.
И главные из них: string Console.ReadLine() и void Console.WriteLine(). По сути мы можем вводить только строку, а для ввода числа необходимо преобразовать введенную строку в число соответствующего формата методами класса Convert.
Рассмотрим примеры стандартных действий:
// Подсказка - приглашение к диалогу Console.Write("Ваше имя: "); // Ввод строки string name = Console.ReadLine(); // Приветствие + подсказка Console.Write("Привет, " + name + "\nВведите Ваш рост в см: "); // Ввод числа. Чтобы сразу получить число, используйте методы класса Convert double height = Convert.ToDouble(Console.ReadLine())/100; name = "Петр 1"; double height_P = 2.04; if (height < height_P) Console.WriteLine(name + " был чуть выше Вас ростом!"); else Console.WriteLine("Не всякие императоры обладали высоким ростом!"); int a = 13; // Составные строки из строковых констант, переменных и выражений Console.WriteLine("Сторона квадрата: " + a + " площадь: " + a * a); Console.WriteLine("Имя: " + name + " Рост: " + height_P + " м");
Вывод через подстановку переменных в фигурные скобки
Console.WriteLine("Имя: Рост: м", name, height_P);
Использование интерполяции. Символ $ перед » … «. Добавлено в последних версиях языка, наиболее изящный способ вывода:
Console.WriteLine($"Имя: Рост: м");
Вывод чисел с округлением по формату и без:
double e = Math.E; // Константа класса Math Console.WriteLine("e = | | | ", e, e, e, e);
Для форматирования целочисленных значений применяется описатель «d». Число после описателя указывает, сколько цифр будет в числовом значении. Если в исходном числе цифр меньше, то к нему добавляются нули.
int number = 314; string result = String.Format("", number); Console.WriteLine(result); string result1 = String.Format("", number); Console.WriteLine(result1);
Форматирование дробных чисел.
Для форматирования дробных чисел используется описатель F, число после которого указывает, сколько знаков будет использоваться после разделителя между целой и дробной частью. Если исходное число — целое, то к нему добавляются разделитель и нули.
int number2 = 23; string result2 = String.Format("", number2); Console.WriteLine(result2); // 23,00 double number3 = 45.08; string result3 = String.Format("", number3); Console.WriteLine(result3); // 45,0800 double number4 = 25.07; // вывод с округлением string result4 = String.Format("", number4); Console.WriteLine(result4); // 25,1
Формат процентов. Описатель «P» задает отображение процентов. Используемый с ним числовой спецификатор указывает, сколько знаков будет после запятой:
decimal number5 = 0.314158m; Console.WriteLine("", number5);
Настраиваемые форматы.
Используя знак #, можно настроить формат вывода. Например, нам надо вывести некоторое число в формате телефона +х (ххх)ххх-хх-хх:
long number6 = 19876543210; string result6 = String.Format("", number6); Console.WriteLine(result6);
Метод ToString() не только получает строковое описание объекта, но и может осуществлять форматирование. Он поддерживает те же описатели, что используются в методе Format:
long number7 = 19876543210; Console.WriteLine(number7.ToString("+# (###) ###-##-##"));// +1 (987) 654-32-10 Console.ReadKey();
Результат выполнения программы должен выглядеть так:
Ваше имя: Сергей Привет, Сергей Введите Ваш рост в см: 202 Петр 1 был чуть выше Вас ростом! Сторона квадрата: 13 площадь: 169 Имя: Петр 1 Рост: 2,04 м Имя: Петр 1 Рост: 2,04 м Имя: Петр 1 Рост: 2,04 м e = 2,7 | 2,72 | 2,718 | 2,71828182845905 314 0314 23,00 45,0800 25,1 31,4% +1 (987) 654-32-10 +1 (987) 654-32-10
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
