- •2. Основы языка c#
- •2.1. Основные элементы языка c#
- •2.1.1. Переменные и константы
- •2.1.2. Модификаторы доступа
- •2.1.3. Присваивание значений переменным
- •2.2. Типы данных
- •2.2.1. Значащие и ссылочные типы
- •2.2.2. Таблица типов данных
- •2.2.3. Приведение и преобразование типов
- •2.2.4. Совместимость типов
- •2.2.5. Методы преобразования типа
- •2.3. Общая структура программы на c#
- •Interface iYourInterface // определение интерфейса
- •2.3.1. Метод Main() и аргументы командной строки
- •2.3.2. Пространства имен
- •2.4. Выражения и операции
- •2.7. Методы класса System.Match
- •2.8. Методы класса System.Random
2.4. Выражения и операции
(http://msdn.microsoft.com/ru-ru/library/ms173142)
(http://msdn.microsoft.com/ru-ru/library/6a71f45d)
Таблица 2.6. Операции по категориям и их приоритет
Выражение |
Описание (приоритет) |
|
Основные операторы (9) |
x.y |
Доступ к членам |
f(x) |
Вызов функции, метода и делегата |
a[x] |
Доступ к элементу массива |
x++ |
Постфиксное приращение (инкремент) |
x-- |
Постфиксное уменьшение (декремент) |
new T(...) |
Создание объекта и делегата |
new T(...){...} |
Создание объекта с инициализатором |
new {...} |
Анонимный инициализатор объекта |
new T[...] |
Создание массива. |
typeof(T) |
Получение объекта System.Type для T (определение типа) |
checked(x) |
Вычисление выражения в проверенном контексте (создание проверяемого блока) |
unchecked(x) |
Вычисление выражения в непроверенном контексте (создание непроверяемого блока) |
default(T) |
Получение значения по умолчания для типа T |
delegate {} |
Анонимная функция (анонимный метод) |
x->y |
Объединение разыменования указателя и доступа к члену (x – это указатель типа T*, а y – это член T) (требуется небезопасный контекст) |
|
Унарные операторы (8) |
+x |
Унарный плюс |
-x |
Унарный минус |
!x |
Логическое отрицание |
~x |
Поразрядное отрицание (инверсия разрядов) |
++x |
Префиксное приращение (инкремент) |
--x |
Префиксное уменьшение (декремент) |
(T)x |
Явное преобразование типа переменной x в тип T |
& |
Унарный оператор возвращает адрес своего операнда (требуется небезопасный контекст) |
sizeof(x) |
Определяет размер в байтах для переменной встроенного типа (а также ссылочного типа, типа указателей, структур). |
|
Мультипликативные операторы (7) |
* |
Умножение |
/ |
Деление |
% |
Остаток от деления |
|
Аддитивные операторы (6) |
x + y |
Сложение, объединение строк, объединение делегатов |
x - y |
Вычитание, удаление делегатов |
|
Операторы сдвига (5) |
x << y |
Сдвиг влево |
x >> y |
Сдвиг вправо |
|
Операторы отношения и типа (4) |
x < y |
Меньше |
x > y |
Больше |
x <= y |
Меньше или равно |
x >= y |
Больше или равно |
x is T |
Проверка принадлежности к типу. Возвращает значение true, если x относится к типу T, в противном случае возвращает значение false |
x as T |
Преобразование типа. Возвращает x типа T или нулевое значение, если x не относится к типу T |
|
Операторы равенства (3) |
x == y |
Равно |
x != y |
Не равно |
|
Логические, условные операторы и Null-операторы (2) |
x & y |
Логическое умножение – для операндов типа bool. Поразрядное И (AND) – для целых операндов |
x | y |
Логическое сложение – для операндов типа bool. Поразрядное ИЛИ (OR) – для целых операндов |
x ^ y |
Логическое исключающее ИЛИ – для операндов типа bool. Поразрядное исключающее ИЛИ (XOR) – для целых операндов |
x && y |
Условное умножение (AND) – вычисляет y только если x имеет значение true |
x || y |
Условное сложение (OR) – вычисляет y только если x имеет значение false |
x ?? y |
Объединение нулей – равно y, если x – нулевое, в противном случае равно x |
x ?: y : z |
Условная операция. Результат равен y, если x имеет значение true, и z если x имеет значение false |
|
Операторы назначения и анонимные операторы (1) |
= |
Присваивание |
x op= y |
Составное присваивание. Поддерживает следующие операторы: += , -= , *= , /= , %= , &= , |= , ^= , <<= , >>= |
(T x) => y |
Анонимная функция (лямбда-выражение) |
Основные операции.
Операции постфиксных инкремента и декремента:
int x = 1;
Console.WriteLine("{0} {1} {2}", x++, x--, x); // Вывод: 1 2 1
Операция sizeof(x) определяет размер в байтах для переменной встроенного или ссылочного типа, а также типа указателей или структур:
int intSize = sizeof(int); // Результат: intSize = 4
Пример 2.4. Использование операции ->.
/ Компилировать с ключем: /unsafe
struct Point
{ public int x, y;
}
class MainClass12
{ unsafe static void Main()
{ Point pt = new Point();
Point* pp = &pt;
pp->x = 123;
pp->y = 456;
Console.WriteLine("{0} {1}", pt.x, pt.y); // Вывод: 123 456
}
}
Унарные операции.
Пример 2.5. Использование операции инверсии разрядов целого числа (~).
using System;
class Demo
{ public static string ByteToStr(byte b)
// Преобразование байта (b) в двоичную форму
{ string s = ""; // Выходная строка
// Цикл преобразования 8-ми разрядов
for (sbyte n = 7; n >= 0; n--)
{ if ((byte)(b / Math.Pow(2, n)) == 1)
{ s = s + '1';
b = (byte)(b - (byte)(Math.Pow(2, n)));
}
else
s = s + '0';
}
return s;
}
static void Main()
{ byte b = 1;
int i = (int) b;
i = ~i;
byte b2 = (byte) (i);
Console.WriteLine("Демонстрация инверсии разрядов " +
"целого числа:");
Console.WriteLine("Значение байта без инверсии: {0,3};\t" +
"двоичная форма: {1}", b, ByteToStr(b));
Console.WriteLine("Значение байта с инверсией: {0,3};\t" +
"двоичная форма: {1}", b2, ByteToStr(b2));
Console.ReadLine();
}
}
/* Вывод:
Демонстрация инверсии разрядов целого числа:
Значение байта без инверсии: 0; двоичная форма: 00000001
Значение байта с инверсией: 255; двоичная форма: 11111110
*/
Операции сдвига.
Пример 2.6. Использование сдвиговых операций.
using System;
class Demo
{ public static string ByteToStr(byte b)
// Преобразование байта (b) в двоичную форму
{ ... // Код функции смотри в примере 2.5
}
static void Main()
{ Console.WriteLine("Демонстрация сдвига разрядов " +
"целого числа:");
byte b = 1;
for (int i = 1; i <= 8; i++)
{ Console.WriteLine("Значение байта: {0,3};\t" +
"двоичная форма: {1}", b, ByteToStr(b));
int k = (int) b;
b = (byte)(k << 1);
}
Console.ReadLine();
}
}
/* Вывод:
Демонстрация сдвига разрядов целого числа:
Значение байта: 1; двоичная форма: 00000001
Значение байта: 2; двоичная форма: 00000010
Значение байта: 4; двоичная форма: 00000100
Значение байта: 8; двоичная форма: 00001000
Значение байта: 16; двоичная форма: 00010000
Значение байта: 32; двоичная форма: 00100000
Значение байта: 64; двоичная форма: 01000000
Значение байта: 128; двоичная форма: 10000000
*/
Условная операция ?: имеет три операнда:
<условие> ? <выражение_1> : <выражение_2>;
Например:
int а = 1, b = 4, с;
с = (а > b) ? а : b; // Результат: с = 4
а = (с > 0) ? ++а : ++Ь; // Результат: а = 2
C# допускает использование сокращенных записей операций с присваиванием (составного присваивания):
А += В вместо А = А + В А &= В вместо А = А & В
А -= В вместо А = А - В А |= В вместо А = А | В
А *= В вместо А = А * В А ^= В вместо А = А ^ В
А /= В вместо А = А / В А <<= В вместо А = А << В
А %= В вместо А = А % В А >>= В вместо А = А >> В
