Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky

.pdf
Скачиваний:
34
Добавлен:
22.03.2016
Размер:
2.08 Mб
Скачать

delegate

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

Соседние файлы в папке CSBasicCourse2ndedPodbelsky