Выражение и оператор
Выражение – операнды, объединенные знаками операций. Любое выражение, завершенное ”;” – оператор. Одиночный символ ”;”, не относящийся ни к одному оператору – пустой оператор.
Операндами могут быть:
1. Вызов метода
2. Переменная
3. Константа
4. Выражение
Операции имеют приоритет. Приоритет предписывает очередность выполнения операций в выражении. Операции одного приоритета выполняются слева направо. Исключения будут оговорены особо. Порядок операций можно регулировать скобками “()”.
В зависимости от числа операндов различают:
1) Унарные
2) Бинарные
3) Тернарные
Приоритеты операций по группам:
· Вызов метода
· Унарные операции
· Арифметические операции
· Сдвиги
· Отношения
· Битовые
· Логические
· Тернарная
· Присваивание
Операции присваивания
Простое присваивание
А=В
1. Вычисляется значение В
2. Если тип переменной А и тип выражения В не совпадают, то значение В преобразуется к типу А
3. Значение В заносится в область памяти, отведенную для переменной А
int a, b;
a=10;
b=5;
a=a+b;
Операции присваивания выполняются справа налево.
int a , b , с;
a = b = c =100;
Составное присваивание объединяет присваивание и одну из бинарных операций
А * = В => А = А * В, где * – бинарная операция
int a =10;
a +=3; // a = a +3; a =13
Преобразование типов выполняется автоматически при выполнении следующих условий:
1. Типы совместимы
2. Преобразование не приведет к потери информации
Совместимые типы
Приемник Источник
bool bool
char char
decimal decimal, char, целый тип
целый тип целый тип, char
вещественный тип вещественный тип, целый тип, char
Если типы совместимы, проверяется возможность потери информации при преобразовании. Потери возможны:
1. При присваивании целой переменной вещественного значения (теряется дробная часть)
2. При присваивании переменной с меньшим диапазоном значений значения переменной с большим диапазоном значений.
В случае возможности потери информации фиксируется ошибка.
Рассмотренная схема преобразования типов уникальна только для операции присваивания, во всех остальных операциях действует другая схема.
2. Преобразование типов операндов при выполнении операций
Перед выполнением операции все операнды целого типа со знаком, которые по длине короче, чем int преобразуются в int, а беззнаковые операнды короче uint, преобразуются в uint.
Перед выполнением операции операнд младшего типа преобразуется к операнду старшего типа. Старшим считается тип, у которого больше диапазон значений.
Больше Меньше
Исключение
Особая ситуация: операнды типов uint и int. Эти типы имеют одинаковый по величине диапазон значений, но смещенный на числовой оси. В этом случае оба операнда преобразуются к типу long.
Тип результата операции будет совпадает с типом операндов после преобразования.
Преобразования выполняются при выполнении операции и не влияют на хранение значений операндов в памяти.
Арифметические операции
Унарные
Изменение знака
Унарный +
Инкремент
Декремент
Изменение знака
int a=10, b=20, c, d;
c =- a ; // с=-10
d =+ b ; // d=20
Инкремент предназначен для увеличения значения переменной на единицу, а декремент – для уменьшения значения переменной на единицу.
int a =10;
|
++а; // а=а+1; а=11
int a =10;
|
--а; // а=а-1; а=9
Операции инкремент и декремента могут использоваться как в префиксной форме (знак перед переменной), так и в постфиксной форме (знак после переменной). Отличия будут проявляться при использовании операции в выражении: префиксная – сначала изменяется значение переменной, потом используется новое значение; постфиксная – сначала используется старое значение переменной, потом изменяется значение переменной.
int a=10, b=10, x, y;
x=a++; //.a=11 → x=10
y =++ b ; // b=11 → y=11
Бинарные операции
уменьшение
приоритета
int a , b ;
double c;
a=10/4; //a=2
c=10/4.; //c=2.5
b =10./4; //ошибка!!! (10./4.=2.5)
при присваивании возможна
потеря информации!!!
int a ;
а=10%3; //а=1
а=-10%3; //а=-1
а=10%-3; //а=1
а=-10%-3; //а=-1
5 Операция явного преобразования типа
(Тип приемника) операнд
преобразование к типу приемника
int a;
double b;
a=(int)3.5; //a=3
b =( int )3.5+5.5; //b=3+5.5=8.5
6 Операция явного преобразования типа
bool a, b, c;
a= 10>5; // true
b= ’B’>’A’; // true
c= 65==’A’; // true
Логические операции
bool a ;
a = !(10>5 && 3==8); //true
Операции сдвига
Для знаковых типов – арифметический сдвиг, для беззнаковых – логический.
ushort a=0x8005, b;
b=(ushort)(a>>1);
01000 0000 0000 010 1
short a=-0x1005, b;
b=(short)(a>>1);
11110 1111 1111 110 1
пишем знак числа на освободившееся место
Битовые операции
byte a =0 x 1 F , b =0 x 3 A , d ;
d =( byte )(~( a ^ b ));
Операции выполняются поразрядно:
0001 1111
0011 1010
0010 0101 a ^ b
1101 1010 ~( a ^ b )
Тернарная операция
Предназначена для реализации простейшего варианта ветвления.
Операнд1? Операнд2:Операнд3
Выполнение операции иллюстрируется приведенной ниже схемой, а применение операции для вычисления минимального из трех целых чисел – фрагментом программы.
:
int a, b, c, min;
…
a=10; b=5; c=8;
min = a;
min = b < min ? b :mn;
min = c < min ? c :mn;
ОПЕРАТОРЫ УПРАВЛЕНИЯ
В языке С# реализован полный набор управляющих конструкций структурного программирования: следование, ветвление, цикл. Кроме того, имеются дополнительные операторы управления.
Следование
Операторы по умолчанию выполняются последовательно в порядке записи. Операторы, заключенные в фигурные скобки {} образуют блок операторов. Блок операторов рассматривается транслятором как один составной оператор.
{оператор … оператор} блок операторов
В качестве оператора могут быть:
· объявление
· выражение, заканчивающееся символом точи с запятой
· управление
· блок операторов
Поскольку блок операторов может содержать объявление переменных, то возникает проблема области видимости локальной переменной. Проблема решается следующим образом: переменная, объявленная в блоке, видна в этом блоке и во вложенных блоках, но не видна в охватывающем блоке.
Ветвление
Дата: 2019-02-02, просмотров: 267.