- •Операторы и выражения Варианты заданий
- •Методические указания
- •Выражения
- •Приоритет и порядок выполнения операций
- •Выражения в скобках
- •Условное выражение
- •Инкремент и декремент
- •Арифметические операции
- •Именованные константы
- •Операции отношения
- •Операции сдвига
- •Логические операции
- •Логические операции над булевскими операндами
- •Логические операции над булевскими операндами и целыми числами.
- •Класс Math и его функции
Условное выражение
В C#, как и в C++, разрешены условные выражения. Конечно, без них можно обойтись, заменив их условным оператором. Вот простой пример их использования, поясняющий синтаксис их записи:
//Условное выражение
int a = 7, b = 9, max;
max = (a > b) ? a : b;
Условное выражение начинается с условия, заключенного в круглые скобки, после которого следует знак вопроса и пара выражений, разделенных двоеточием " : ". Условие задается выражением типа bool. Если оно истинно, то из пары выражений выбирается первое, в противном случае результатом является значение второго выражения. В данном примере переменная max получит значение 9.
Заметьте, условное выражение является примером тернарного выражения - выражения с тремя операндами. И здесь, как и в случае условных логических операций, не требуется, чтобы все операнды были определены. Если булевский операнд определен и имеет значение true, то вычисляется второй операнд, а третий операнд не вычисляется и может быть в этот момент не определен.
Инкремент и декремент
Операции увеличения и уменьшения на 1 (++ и --). Имеют две формы записи – префиксную и постфиксную. В префиксной форме сначала изменятся операнд, а затем его значение становится результирующим значением выражения, а в постфиксной форме значением выражения является исходное значения операнда, после чего он изменяется.
static void Main()
{ int x = 3, y = 3;
Console.WriteLine( "Значение префиксного выражения: {0} \n", ++x );
Console.WriteLine ( "Значение постфиксного выражения: {0} \n", y++ );
Console.WriteLine ( "Значение х после приращения: {0} \n", x );
Console.WriteLine ( "Значение у после приращения: {0} \n", у );
}
Результат работы программы:
Значение префиксного выражения: 4
Значение постфиксного выражения: 3
Значение х после приращения: 4
Значение у после приращения: 4
В справочной системе утверждается, что к высшему приоритету относятся постфиксные операции x++ и x--, это нашло отражение в таблице 2.1. Префиксные операции имеют на единицу меньший приоритет.
Следует также заметить, что запись в C# выражения < --x++ > приведет к ошибке.
Операции выполняются только тогда, когда вычисляется соответствующий операнд, а не в соответствии с приоритетом, указанным в таблице 21. Важнее помнить, что хороший стиль программирования рекомендует использовать эти операции только в выражениях, не содержащих других операндов. Еще лучше вообще не использовать их в выражениях, а применять их только как операторы:
x++; y--;
В этом случае фактически исчезает побочный эффект, являющийся опасным средством, и операции используются как краткая запись операторов:
x = x + 1; y = y - 1;
Арифметические операции
В языке C# имеются обычные для всех языков арифметические операции - "+, -, *, /, %". Все они перегружены. Операции "+" и "-" могут быть унарными и бинарными. Унарные операции приписывания знака арифметическому выражению имеют наивысший приоритет среди арифметических операций. К следующему приоритету относятся арифметические операции типа умножения, к которому относятся три операции - умножения, деления и взятия остатка. Все эти операции перегружены и определены для разных подтипов арифметического типа. Следует, однако, помнить, что арифметические операции не определены над короткими числами (byte, short) и начинаются с типа int.
Операция деления "/" над целыми типами осуществляет деление нацело, для типов с плавающей и фиксированной точкой - обычное деление. Операция "%" возвращает остаток от деления нацело и определена не только над целыми типами, но и над типами с плавающей точкой. Тип результата зависит от типов операндов. Приведу пример вычислений с различными арифметическими типами:
/// <summary>
/// Арифметические операции
/// </summary>
static void Ariphmetic()
{
byte b1 = 7, b2 = 3, b3;
b3 = (byte)(b1 / b2);
int n = -7, m = 3, p, q, r;
p = n / m; q = n % m; r = p*m + q;
Console.WriteLine("Операции над типом int");
Console.WriteLine(
"n = {0}, m = {1}, p = n/m = {2}, " +
"q = n % m = {3}, r = p*m + q = {4}",
n, m, p, q, r);
Console.WriteLine("Операции над типом double");
double x = 7.5, y = 3.5, u, v, w;
u = x / y; v = u * y;
w = x % y;
Console.WriteLine(
"x = {0}, y = {1}, u = x/y = {2}, " +
"v = u*y = {3}, w = x % y = {4}",
x, y, u, v, w);
Console.WriteLine("Операции над типом decimal");
decimal d1 = 7.5M, d2 = 3.5M, d3, d4, d5;
d3 = d1 / d2; d4 = d3 * d2;
d5 = d1 % d2;
Console.WriteLine(
"d1 = {0}, d2 = {1}, d3 = d1/d2 = {2}, " +
"d4 = d3*d2 = {3}, d5 = d1 % d2 = {4}",
d1, d2, d3, d4, d5);
}//Ariphmetica
Результаты вычислений показаны на рис. 2.1.
Рис. 2.1. Результаты работы вызова метода Ariphmetic
Для целых типов можно исходить из того, что равенство n=(n/m)*m+n истинно. Для типов с плавающей точкой выполнение точного равенства x=(x/y)*y следует считать скорее случайным, а не закономерным событием. Законно невыполнение этого равенства, как это происходит при вычислениях с фиксированной точкой.