Преобразования типов выполняются по принятым в C# правилам продвижения типов.Ниже приведен алгоритм, определяемый этими правилами для операций с двумя операндами.
ЕСЛИ один операнд имеет тип decimal, ТО и второй операнд продвигается
к типу decimal(но если второй операнд имеет тип floatили double, результат
будет ошибочным).
ЕСЛИ один операнд имеет тип double, ТО и второй операнд продвигается
к типу double.
ЕСЛИ один операнд имеет тип float, ТО и второй операнд продвигается к типу
float.
ЕСЛИ один операнд имеет тип ulong, ТО и второй операнд продвигается
к типу ulong(но если второй операнд имеет тип sbyte, short, intили long,
результат будет ошибочным).
ЕСЛИ один операнд имеет тип long, ТО и второй операнд продвигается к типу
long.
ЕСЛИ один операнд имеет тип uint, а второй — тип sbyte, shortили int, ТО
оба операнда продвигаются к типу long.
ЕСЛИ один операнд имеет тип uint, ТО и второй операнд продвигается к типу
uint.
ИНАЧЕ оба операнда продвигаются к типу int.
// Пример неожиданного результата продвижения типов!
using System;
|
|
class PromDemo
{
static void Main()
{
byte b;
b = 10;
b = (byte)(b * b); // Необходимо приведение типов!!
Console.WriteLine("b: " + b);
}
}
Как ни странно, но когда результат вычисления выражения b*b присваивается обратно переменной b, то возникает потребность в приведении к типу byte!Объясняется это тем, что в выражении b*bзначение переменной bпродвигается к типу intи поэтому не может быть присвоено переменной типа byteбез приведения типов.
В следующем фрагменте кода требуется обратное приведение
к типу char, поскольку операнды ch1 и ch2 в выражении продвигаются к типу int.
char ch1 = 'a', ch2 = 'b';
ch1 = (char)(ch1 + ch2);
Приведение типов в выражениях
// Пример приведения типов в выражениях.
using System;
class CastExpr
{
static void Main()
{
double n;
for (n = 1.0; n <= 10; n++)
{
Console.WriteLine("Квадратный корень из {0} равен {1}",
n, Math.Sqrt(n));
Console.WriteLine("Целая часть числа: (0)",
(int)Math.Sqrt(n));
Console.WriteLine("Дробная часть числа: (0)",
Math.Sqrt(n) - (int)Math.Sqrt(n));
Console.WriteLine();
}
}
}
ГЛАВА
Операторы
Операторы отношения и логические операторы
Операторы отношения
== Равно
!= Не равно
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно
К числу логических относятся операторы, приведенные ниже
& И (*)
| ИЛИ (+)
^ Исключающее ИЛИ
&& Укороченное И
|| Укороченное ИЛИ
! НЕ
Импликация — это двоичная операция, результатом которой является ложное значение только в том случае, если левый ее операнд имеет истинное значение, а правый — ложное.
P q
true true true
true false false
false false true
false true true
Операция импликации может быть построена на основе комбинации логических
операторов!и |, как в приведенной ниже строке кода
|
|
!р | q
// Построение операции импликации в С#.
using System;
class Implication
{
static void Main()
{
bool p = false, q = false;
int i, j;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 2; j++)
{
if (i == 0) p = true;
if (i == 1) p = false;
if (j == 0) q = true;
if (j == 1) q = false;
Console.WriteLine("p равно " + p + ", q равно " + q);
if (!p | q)
Console.WriteLine("Результат импликации " + p +
" и " + q + " равен " + true);
Console.WriteLine();
}
}
}
}
Результат выполнения этой программы выглядит так.
р равно True, q равно True
Результат импликации True и True равен True
р равно True, q равно False
р равно False, q равно False
Результат импликации False и True равен True
р равно False, q равно False
Результат импликации False и False равен True