
- •3. Лекция: Выражения и операции
- •Выражения
- •Приоритет и порядок выполнения операций
- •Перегрузка операций и методов
- •Преобразования типов
- •Организация программного проекта ConsoleExpressions
- •Операции высшего приоритета
- •Выражения в скобках
- •Операция индексации a[I, j]
- •Операция new
- •Операции sizeof и typeof
- •Операции "увеличить" и "уменьшить" (increment, decrement)
- •Унарные операции приоритета 1
- •Операция кастинга - приведения к типу
- •Проверяемые и непроверяемые блоки и выражения
- •Арифметические операции
- •Вычисление выражений
- •Память и время - два основных ресурса
- •Именованные константы
- •Операции отношения
- •Операции проверки типов
- •Операции сдвига
- •Логические операции
- •Логические операции над булевскими операндами
- •Логические операции над булевскими операндами и целыми числами. Работа со шкалами
- •Условное выражение
- •Операция присваивания
- •Операция ?? - новая операция c# 2.0
- •Лямбда-оператор - новая операция в c# 3.0
- •Преобразования внутри арифметического типа
- •Выражения над строками. Преобразования строк
- •Преобразования строкового типа в другие типы
- •Метод Parse
- •Преобразование в строковый тип
- •Класс Convert и его методы
- •Класс Console и его методы
- •Методы Read и ReadLine
- •Вывод данных на консоль. Методы Write и WriteLine
- •Вычисление выражений. Оценка времени вычислений
- •Геометрические фигуры
- •Преобразования типов
- •Проекты
-
Выражения над строками. Преобразования строк
Начнем с символьного типа. Давайте уточним, какие выражения можно строить над операндами этого типа. На алфавите символов определен порядок, задаваемый Unicode кодировкой символов. Знать, как кодируется тот или иной символ, не обязательно, но следует помнить, что кодировка буквенных символов таких алфавитов, как кириллица, латиница и других языковых алфавитов, являющихся частью Unicode алфавита, является плотной, так что, например, код буквы "а" на единицу меньше кода буквы "б". Исключение составляет буква "Ё", выпадающая из плотной кодировки. Большие буквы (заглавные) в кодировке предшествуют малым буквам (строчным). Для цифр также используется плотная кодировка.
Поскольку каждому символу однозначно соответствует его код, существует неявное, автоматически выполняемое преобразование в целочисленный тип (int и выше). Обратное преобразование также существует, но должно быть явным. Вот пример, показывающий, как по символу получить его код и как по коду получить символ, соответствующий коду.
char sym = 'Ё';
int code_Sym = sym;
Console.WriteLine("sym = {0}, code = {1}",
sym, code_Sym);
code_Sym++;
sym = (char)code_Sym;
Console.WriteLine("sym = {0}, code = {1}",
sym, code_Sym);
Существование неявного преобразования между типом char и целочисленными типами позволяет рассматривать тип char как целочисленный. Как следствие, к операндам символьного типа применимы все операции, применимые к целочисленным типам - операции отношения, арифметические операции, логические операции над целыми числами. В реальных программах к таким операндам чаще всего применяются операции сравнения и операция вычитания, позволяющая определить "расстояние" между символами в кодировке.
Рассмотрим содержательный пример, в котором используются операции сравнения символов.
/// <summary>
/// Соответствует ли s требованиям,
/// предъявляемым к именам в русском языке:
/// Первый символ - большая буква кириллицы
/// Остальные символы - малые буквы кириллицы
/// </summary>
/// <param name="s">входная строка</param>
/// <returns>
/// true, если s соответствует правилам,
/// false - в противном случае
/// </returns>
public bool IsName(string s)
{
if (s == "") return false;
char letter = s[0];
if(!(letter >= 'А' && letter <= 'Я'))return false;
for(int i=1; i< s.Length; i++)
{
letter = s[i];
if (!(letter >= 'а' && letter <= 'я')) return false;
}
return true;
}
Рассмотрим теперь строковый тип. В некоторых языках программирования используется тот факт, что порядок на символах алфавита порождает лексикографический порядок на словах, составленных из этих символов. Но в языке C# это не так, и здесь не существует неявного преобразования строки в целочисленный тип. Понять причину этого не трудно. Строки C# имеют переменную длину и могут быть сколь угодно длинными, так что не существует безопасного преобразования ни в один из целочисленных типов.
По этой причине над операндами строкового типа из множества операций, задаваемых знаками логических, арифметических и операций отношения, определены только три операции. Две операции позволяют сравнивать строки на эквивалентность (==, !=). Третья операция, задаваемая знаком операции "+", называется операцией конкатенации или сцепления строк и позволяет вторую строку присоединить к концу первой строки. Вот пример:
string s1 = "Мир";
if (s1 == "Мир" | s1 == "мир") s1 += " Вам";
Console.WriteLine(s1);
Операций над строками немного, но методов вполне достаточно. Сравнивать две строки, используя знаки операций " >, < ", нельзя, но есть методы сравнения Compare, решающие эту задачу. О работе со строками более подробно поговорим в отдельной лекции.