
4.4. Выражение с символьными операндами
Если символьное значение (символ или переменная типа char) используется в арифметическом выражении, то С# автоматически выполняет его преобразование из типа char в числовое значение его кода. То же справедливо и в случае, когда в выражении с арифметическими операциями участвуют несколько символьных переменных или констант.
В качестве иллюстрации сказанного рассмотрим следующую программу:
// 04_03.cs - выражения с символьными операндами
static void Main()
{
char c = 'c', h = '\u0068', a = '\x61', r = '\u0072';
Console.WriteLine("" + c + h + a + r);
Console.WriteLine(c + h + a + r);
}
Результат выполнения программы:
char
414
В программе символьные переменные с (десятичный код 99), h (десятичный код 104), а (десятичный код 97), г (десятичный код 114), представляют, соответственно, символы 'с', 'h', 'а', 'r'. При первом обращении к методу WriteLine() знак + играет роль операции конкатенации, аргумент (выражение) ""+c+h+a+r преобразуется к строковому виду и имеет значение строки "char". Связано это с правилом, по которому в выражении строка + символ правый операнд приводится к типу строки, а затем выполняется конкатенация двух строк. Таким образом, вначале ""+'с' превращается в строку "с", затем выражение V+'h' преобразуется в "ch" и т.д. При втором обращении к методу WriteLine() аргумент с + h + а + r воспринимается как арифметическое выражение. Знак + играет роль операции сложения. Коды символов обрабатываются как целые числа, их сумма равна 414. Это число автоматически преобразуется в строку "414" (т.к. аргумент метода WriteLine() должен иметь строковый тип), и эта строка выводится на консоль.
Как отмечено при объяснении правил вычисления значения аргумента метода WriteLine(), результат выражений: строка+символ и символ+строка этоконкатенация строки и строкового представления символа. В следующей программе конкатенация строки и символа выполняется вне метода WriteLine.
// 04_04.cs - строки и символы
static void Main()
{
char simb = 'b'; // десятичный код = 98
string line = "simb = " + simb;
Console.WriteLine(line);
line = simb + " = simb";
Console.WriteLine(line);
line = simb + simb + " = 2 simb";
Console.WriteLine(line);
}
Результат выполнения программы:
simb = b
b = simb
196 = 2 simb
Обратите внимание на выражение simb+simb+" = 2simb". В соответствии с правилами ассоциации для операции + оно вычисляется так: (simb+simb)+ " = 2simb". В скобках символы "ведут себя" как целочисленные значения, и их сумма 196 затем преобразуется в строку.
Хотя мы уже применяли строки в виде строк-литералов и в примерах определяли строку как переменную типа string, но более подробное рассмотрение строк и их взаимоотношений с другими типами языка С# необходимо перенести дальше в раздел, специально посвященный строкам.
Унарные операции ++ и -- изменяют значение кода символьной переменной, однако она не превращается в целочисленную величину, а сохраняет тип char. В то же время суммирование символьной переменной с единицей приводит к получению целочисленного значения. Сложение и вычитание символьных переменных также приводят к соответствующим операциям над их кодами с формированием целочисленных результатов. Следующая программа иллюстрирует приведенные правила.
// 04_05.cs - выражения с символами и строками
static void Main()
{
char cOld = 'a', cNew = cOld;
Console.Write("B последовательности ");
Console.Write(++cNew); // выводит 'b'
Console.Write(++cNew); // выводит 'с'
Console.Write(++cNew + " "); // выводит 'd'
Console.WriteLine(cNew - cOld + " буквы");
}
Результат выполнения программы: В последовательности bcd 3 буквы
Чтобы получить символ с нужным числовым значением кода, нужно применить операции явного приведения типов. Например, так: char ch = (char)94; // значение ch - символ '^'
Для обратного преобразования (из char, например, в uint) достаточно автоматического приведения типов:
uint cod = ch; // значением cod будет 94.