
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky
.pdfdelegate |
do |
|
double |
else |
|
enum |
event |
explicit |
extern |
false |
finally |
||
fid |
float |
|
for |
foreach |
goto |
|
if |
implicit |
in |
int |
|
interface |
|
internal |
is |
|
lock |
long |
|
namespace |
new |
null |
|
object |
operator |
out |
|
override |
params |
private |
protected |
public |
||
readonly |
ref |
|
return |
sbyte sealed |
||
short |
sizeof |
stackalloc staticstring |
|
true |
||
struct |
switch |
this |
throw |
|||
try |
typeof |
uint |
ulong |
unchecked |
||
unsafe |
ushort |
using |
virtual |
void |
|
|
volatile |
while |
|
|
|
|
|
Следует отметить, что в табл. 2.2 не включены идентификаторы, которые
играют роль ключевых слов только в конкретном контексте. Примеры: |
into, set, |
yield. |
|
Познакомившись со списком служебных слов, читатель сразу же обнаружит ошибку в следующем объявлении:
int try = 15; //ошибка в имени переменной!
Инициализирующее выражение чаще всего константа, однако, может быть любым выражением, операнды которого имеют конкретные значения в момент объявления переменной. По типу вычисляемого значения инициализирующее выражение должно соответствовать типу создаваемой переменной.
Примеры объявлений переменных: double pi2=6.28;
int два=2;
В объявлении переменной может отсутствовать инициализация. Однако, язык С# очень строг и не допускает существования в программе переменных с неопределёнными значениями. Поэтому после объявления переменной без её инициализации необходимо каким-то образом присвоить ей значение. Обычно для этого используют оператор присваивания:
имя_переменной = выражение;
Пример (удельный заряд электрона в единицах СГСЭ/г): double electron_charge; // объявление electron_charge=5.27e+17; // присваивание значения
В отличие от литералов "литералов" \y "литерал" , которые сами по себе представляют собственные значения и не требуют предварительных объявлений,
именованные константы "именованные константы" вводятся с помощью конструкции:
const type name = expression;
Отличие от объявления переменной: наличие модификатора const и
обязательность инициализации.
Контрольные вопросы
Чем отличаются типы знаковые от беззнаковых.
Приведите примеры констант-литералов числовых (арифметических) типов.
Укажите назначение десятичного типа и правила записи его констант.
Назовите способы записи символьных констант.
Приведите примеры эскейп-последовательностей.
Назовите размеры (в битах) представления в памяти констант базовых типов.
Какие символы допустимы в идентификаторах C#?
Приведите примеры служебных слов языка C#.
Является ли идентификатор Main служебным словом?
Что такое инициализация переменной?
Чем именованная константа отличается от константы-литерала?

Глава 3. Операции и целочисленные выражения
3.1. Операции языка C#
В предыдущей главе мы ввели понятие типа и рассмотрели классификацию типов, принятую в языке C#. Привели сведения о предельных значениях констант и переменных базовых типов. Тем самым для базовых типов определена совокупность допустимых значений. Чтобы полностью охарактеризовать базовые типы, требуется рассмотреть допустимые для них операции.
Набор операций языка C# весьма велик и рассматривать возможности каждой из них мы будем постепенно по мере необходимости. Однако, предварительно приведем список операций, разместив их в порядке уменьшения их приоритетов,
называемых ещё рангами и категориями (табл. 3.1 и 3.2)..
Таблица 3.1.
Операции "операции:базовые операции" , ассоциативные слева – направо.
Базовые (первичные) операции "базовые (первичные) операции" \y "операции"
. |
выбор члена (класса или объекта) |
|
( ) |
вызов метода или делегата |
|
[ ] |
доступ по индексу (индексирование) |
|
++ |
постфиксный инкремент |
|
- - |
постфиксный декремент |
|
new |
создание объекта |
(создание |
typeof |
экземпляра) |
|
sizeof |
идентификация типа |
|
checked |
определение размера операнда (только |
|
unchecked |
в опасном коде) |
|
–> |
контроль за переполнениями в |
|
|
выражениях |
|
|
отмена контроля за переполнениями в |
|
|
выражениях |
(объекта) по |
|
доступ к члену |
|
|
указателю (только в опасном коде) |
Унарные операции "унарные операции" \y "операции"

+ |
унарный плюс (задание знака) |
|
- |
унарный минус (задание знака) |
|
++ |
префиксный инкремент |
|
- - |
префиксный инкремент |
|
~ |
поразрядное отрицание |
|
! |
логическое отрицание |
|
(тип) |
приведение к заданному типу |
|
& |
получение адреса (только в опасном |
|
* |
коде) |
|
|
разыменование указателя (только в |
|
|
опасном коде) |
|
|
Арифметические бинарные операции "операции:арифметические |
|
* |
бинарные операции" |
|
умножение |
|
|
/ |
деление |
|
% |
получение остатка при целочисленном |
|
+ |
делении |
|
сложение |
|
|
- |
вычитание |
|
Операции поразрядных сдвигов "операции::поразрядных сдвигов" \y |
||
>> |
"операции" |
|
поразрядный сдвиг вправо |
||
<< |
поразрядный сдвиг влево |
|
< |
Операции отношений (сравнений) |
|
меньше |
|
|
> |
больше |
|
<= |
меньше или равно |
|
>= |
больше или равно |
(возвращает |
is |
сравнение типов |
|
as |
логическое значение) |
|
|
проверка типов (возвращает тип или |
|
== |
null) |
|
сравнение на равенство |
||
!= |
сравнение на неравенство |
|
?? |
Сравнение с null (поглощение null) |
|
|
Поразрядные операции "операции:поразрядные операции" \y |
|
& |
"операции" |
|
побитовое (поразрядное) И |
||
^ |
побитовое |
(поразрядное) |
| |
исключающее ИЛИ |
|
побитовое (поразрядное) ИЛИ |
||
|
Логические бинарные операции "операции:логические бинарные |
|
& |
операции" \y "операции" |
|
конъюнкция (логическое И) |

| |
дизъюнкция (логическое ИЛИ) |
^ |
исключающая дизъюнкция |
&& |
условная конъюнкция |
|| |
условная дизъюнкция |
|
Тернарная операция |
?: |
"тернарная операция" \y "операции" |
условная операция |
|
|
Таблица 3.2 |
|
Операции присваивания (ассоциативные справа – налево) |
= |
присваивание |
+= |
сложение с присваиванием |
-= |
вычитание с присваиванием |
*= |
умножение с присваиванием |
/= |
деление с присваиванием |
%= |
получение остатка от деления с |
&= |
присваиванием |
^= |
поразрядное И с присваиванием |
|= |
поразрядное исключающее ИЛИ с |
>>= |
присваиванием |
<<= |
поразрядное ИЛИ с |
|
присваиванием |
|
поразрядный сдвиг вправо с |
|
присваиванием |
|
поразрядный сдвиг влево с |
|
присваиванием |
В таблице 3.1. операции объединены в группы. В каждую группу помещены операции одного ранга. Операции из таблицы 3.1 выполняются слева направо, но это справедливо только для операций одного ранга. Например, x*y/z будет вычисляться в соответствии с выражением (x*y)/z.
Операции группы, размещенной выше, имеют более высокий ранг, нежели операторы групп, размещенных ниже. Например, 2+6/2 равно 5, так как операция / имеет более высокий ранг, нежели бинарная операция +. Начинающие программисты, забывая о приоритетах операций, иногда ошибаются, приводя для математического соотношения EMBED Equation.3 такое выражение: a/b*c. Его следует записать, используя скобки: a/(b*c), или без скобок так a/b/c.
3.2. Операции присваивания и оператор присваивания
Операции присваивания "операции:операции присваивания" , помещенные в табл. 3.2, имеют более низкий ранг (меньший приоритет), нежели операции из табл.
3.1. Еще одна особенность операций присваивания состоит в том, что они выполняются справа – налево. У всех этих операций одинаковый ранг. Например,
для выражения x=y=z=c с помощью скобок последовательность вычисления можно обозначить так: x=(y=(z=c)). Для сравнения отметим, что выражению x+y+z+c
эквивалентно выражение ((x+y)+z)+c.
Присваивание "присваивание" – фундаментальное понятие
программирования. Средства для выполнения присваивания существуют практически в каждом языке программирования.
Начнём с того, что в С# единичный знак = обозначает бинарную операцию (не оператор!). Формат применения операции присваивания:
имя_переменной = выражение
Конструкция имя_переменной = выражение, представляет собой бинарное выражение с двумя операндами. Последовательность обработки такого выражения следующая:
Вычислить (получить) значение выражения;
Присвоить полученное значение переменной;
Вернуть в точку размещения выражения значение, присвоенное переменной.
Если конструкция имя_переменной = выражение завершается точкой с запятой и размещена в последовательности других операторов программы, то она превращается в оператор присваивания "оператор присваивания" . В этом случае действие ограничивается двумя первыми пунктами: вычислить значение выражения и присвоить полученное значение переменной, поименованной слева от знака присваивания. Третий пункт не нужен – значение всего выражения с операцией присваивания игнорируется. Однако, иногда удобно использовать цепочки присваиваний, и в этом случае для всех выражений присваивания, размещённых справа, их значения используются явно.

Пример: |
int a, b, c, d; |
|
a=b=c=d=842; |
После выполнения такого оператора переменные a, b, c, d принимают одно и то же значение 842. Последовательность вычислений: вычисляется выражение d=842, тем самым переменная d становится равной 842 и это же значение принимает участие в следующем выражении присваивания, где левым операндом служит
переменная c и т.д.
Кроме обычной операции присваивания в С# есть составные операции присваивания "операции:составные операции присваивания" \y "операции" , общую
форму которых можно представить так:
бинарная_операция =
Здесь бинарная_операция — это одна из следующих арифметических и логических операций:
+ сложение, - вычитание, * умножение, / деление,
% получение остатка целочисленного деления, & поразрядная конъюнкция,поразрядная дизъюнкция,
поразрядное исключающее ИЛИ, >> поразрядный сдвиг вправо битового представления значения операнда,
<< поразрядный сдвиг влево битового представления значения операнда.
Назначение составных операций присваивания – упростить запись и ускорить
вычисление выражений присваивания, в которых левый операнд (переменная)
одновременно используется в качестве левого операнда выражения, расположенного
справа от операции присваивания.
Пример оператора присваивания с |
Эквивалентный по результату |
традиционной операцией: |
оператор: |
n=n+48; |
n+=48; |
Традиционный оператор, запись |
Применение составной операции |
которого можно упростить: |
присваивания: |
n=n/(n*n); |
n/=n*n; |
3.3. Операции инкремента (++) и декремента
Сокращёнными формами операции присваивания можно считать операции
автоувеличения (инкремент |
"инкремент" ) ++ и автоуменьшения (декремент |
"декремент" ) ––. |
|
Операция инкремента |
++ увеличивает на 1 значение операнда. Операция |
декремента –– уменьшает на 1 значение операнда. |
|
Обе операции имеют префиксную и постфиксную формы. Префиксная форма |
предусматривает изменение значения операнда до использования этого значения.
Постфиксная изменяет значение операнда после использования этого значения.
Пример:
int zone = 240, res; // объявление двух переменных res = zone++; //Эквивалент: res=zone; zone=zone+1; res =++zone; // Эквивалент: zone=zone+1; res=zone;
Значение res после выполнения всех этих операторов равно 242.
Операндом для операций ++ и –– может быть только леводопустимое неконстантное выражение (например, переменная). Следовательно, ошибочными будут выражения 84--,++0, (n-12)++, --(x+y) и им подобные.
Отметим, что операции ++ и –– применимы к операндам всех базовых типов значений за исключением логического (bool).
3.4. Выражения с арифметическими операциями
Кроме операций инкремента и декремента для целочисленных операндов определены, во-первых, стандартные арифметические операции:
унарные – и + (определяют знак выражения);
бинарные -, +, *, / (вычитание, сложение, умножение, деление).
Среди них заслуживает пояснения только операция деления – ее результат при двух целочисленных операндах всегда округляется до наименьшего по абсолютной
величине целого значения.
// 03_01.cs - целочисленное деление using System;
class Program
{
static void Main()
{
Console.WriteLine("-13/4 = " + -13 / 4); Console.WriteLine("15/-4 = " + 15 /-4); Console.WriteLine("3/5 = " + 3 / 5);
}
}
Обратите внимание на аргумент метода WriteLine(). Это выражение с операцией конкатенации строк +. Первая строка – изображение некоторого выражения. Вторая строка – строковое представление результата вычисления арифметического выражения, например, – 13/4.
Результат выполнения программы:
-13/4 = -3 15/-4 = -3 3/5 = 0
Отдельно следует рассмотреть операцию получения остатка от деления целочисленных операндов %. При ненулевом делителе для целочисленных величин выполняется соотношение:
(x / y * y +x % y) равно x.
Пример:
// 03_02.cs - получение остатка от деления using System;
class Program
{
static void Main()
{

Console.WriteLine("13 % 4 = " + 13 % 4);
Console.WriteLine("-13 % 4 = " + -13 % 4);
Console.WriteLine("13 % -4 = " + 13 % -4);
Console.WriteLine("-13 % -4 = " + -13 % -4); Console.WriteLine("-13/-4*-4 + -13%-4 = " +(-13 / -4 * -4 + -13 % -4));
}
}
Результат выполнения программы:
13 % 4 = 1 -13 % 4 = -1 13 % -4 = 1 -13 % -4 = -1
-13/-4*-4 + -13%-4 = -13
3.5. Поразрядные операции
От языков Си и Си++ язык C# унаследовал операции для работы с битовыми представлениями целых чисел:
~ - поразрядное инвертирование (поразрядное НЕ);
&- поразрядная конъюнкция (поразрядное И);
| - поразрядная дизъюнкция (поразрядное ИЛИ);
^ - поразрядное исключающее ИЛИ;
>> - поразрядный сдвиг вправо;
<< - поразрядный сдвиг влево.
Таблица 3.1
Правила выполнения поразрядных операций
Значения операндов |
|
Результаты выполнения операции |
||
Первого |
Второго |
& |
| |
^ |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |