Добавил:
2200 7008 9480 6099 TKFF БЛАГОДАРНОСТЬ МОЖНО ТУТ ОСТАВИТЬ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДИПЛОМ 2025 / 4 курса_МТУСИ / 1 КУРС / Информатика / С# для чайников - Мюллер.pdf
Скачиваний:
0
Добавлен:
04.06.2025
Размер:
53.3 Mб
Скачать

Обычный калькулятор утверждает, что результат вычислений равен 32. Од­ нако это выражение имеет не только значение, но и тип.

Будучи записанным на "языке типов", оно принимает следующий вид: int [=] ( int * int ) + int ;

Чтобы выяснить тип выражения, нужно следовать тому же шаблону, что

ипри вычислении его значения. Умножение имеет более высокий приоритет, чем сложение. Умножение int на int дает int. Далее следует сложение int

иint, что в результате также дает int. Итак, вычисление типа приведенного выражения происходит таким образом:

( int * int ) + int int + int

int

Вычисление типа операции

Большинство операторов могут иметь несколько вариантов. Например, опе­ ратор умножения может быть следующих видов (стрелка здесь означает "про­ изводит"):

int

*

int

члmint

uint

*

uint

чЭm

uint

long

*

long

,m long

float

*

float

ч,m float

decimal

*

decimal

decimal

douЬle

*

douЬle

"m douЬle

Таким образом, 2*3 использует версию int* int оператора * и дает в резуль­ тате int 6.

Неявное преобразование типов

Все хорошо, просто и понятно, если умножать две переменные типа int или две переменные типа float. Но что если типы аргументов слева и справа различны? Что, например, произойдет в следующей ситуации:

int anlnt = 10; douЬle aDouЫe = 5 . 0;

douЬle result = anlnt * aDouЬle ;

В С# нет оператора умножения int *douЫe. Язык С# мог бы просто сге­ нерировать сообщение об ошибке и предоставить программисту возмож­ ность решать проблему самостоятельно. Однако он пытается понять наме­ рения программиста и помочь ему. В С# есть операторы умножения int * int и douЬle*douЫe. Язык С# мог бы преобразовать aDouЫe в значение int, но такое преобразование привело бы к потере дробной части числа (цифр после десятичной точки). Поэтому вместо этого он преобразует anint в значение

x.7" ЧАСТЬ 1 Основы программирования на С#

 

 

!,D!!!

!!!!D!!!,

 

-iD!!!o!!!i

o !D!!N R!,;mD,Nit r!!!!!!,;!!

R!

 

!-

o!!!!

!- !d!-!!i

 

 

 

 

 

 

 

 

 

ВНИМАНИЕ!

 

 

 

 

 

 

 

 

 

 

 

 

! ! ,;-i!EAB!-i !B ! ! -i!

!,;!!E D! A-i!E

 

 

 

 

 

 

 

 

 

!m!! !R!! it

!d!-D!!R,

ПR!! !DRD!!! !!!!

!!!a!D!!!R!

 

pБt D!!!!

!!!B

d!!!o!R!!!!!!

,;!!!D!!!!

o!

!!D!!!

!-i!!!!!B

!!!

!E-!B

!!!!!!!!!B

R!!!!!

-i!Dm!!!!!

R!!!!oBE

!!!!D!!!D

З Тtt

 

!!!D

t

!!!!!!BХo

!!!!

R!DD!,!! R!-!B !!!-,;!!!B

!!!

-iD!!Em!!!!

B DR!!-!!

!

!DR!!!DrD!!!B

!!!!

R!!!R!D!!!!

!!!!!

!!!D!!!!!B

!!!!!!!!!B

!!!

D!!DD!!!!!

 

D!!! !-!D-i!!

DR!!!,;Eo!!

D!!DD!!!!

!R!!!B-i,;!!R,

!!!!D!!!

,;!!!D!!!,

 

a!!

!!yfa

 

rМ

 

n!!D!!!!!!

 

!d!!e

! !

!!!,; !!! !-iD!R!!!

!D!

Т

ptp

 

ttu

t Х

хu

 

tХ !!!tНo

p

 

 

З ttТt

t

tхt t Н

 

n!!!D!!!!Хo

 

,D!,!!R,

,D

!!!

 

 

!!R!!!B!,;

 

!!!P!D!!!R!

,D!!

!-s:,D!! ! RD!!N!D!!!!!!,

N

 

 

 

 

 

 

o!

!!D!!!

!R,;o!R!D!!B

!!!D!!!!!!

 

!!D!,;

 

!D,;!,

!E-!!!

!!!D

 

 

 

!!

-i!Dm!!!,!!i

!!-iDD!R!!!

!!

!N D-iD!!!!B

 

D!R!!!Н

 

 

 

 

ЗАПОМНИ!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-i-!PDB!!!!,D!!P! !!!!- !D-i!DD!!,

!!!!D

 

КИ!!DB!! DR!!-i!!!!!!,

 

 

 

 

!!!!D

-i!Dm!!!B

,D!!!!

R !!!!oBE

!!!!D!!!D

!!!D!!!!!,

 

ЗА!!

СОВЕТ

R!!DD!!

D!!!,!!!R!B

!!!!!!!D!!!!!!!B

 

!d!-!!

! !!D!

D!! ,;!!-!

o!!D!!!R!B

!!!Dd

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

!!

ED!E,-i

! !!.i DE!EA-i!.i-i!E

 

 

 

 

 

 

 

 

 

 

 

 

 

!

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-i!! it !!

 

!!-iD!!,!!

!!!!-!D-i!D!DD!B

!!,;P!!

!!!!

D!!!

E!!N

!!!

D!!!!

!,!B

!!!!-!D-i!DD!!!

!!!D

E!!e

D!!,;P!!

!!!!i

 

 

 

 

 

 

 

 

 

АoDmD SE !!!E!!d

109

Типы при присваивании

Все сказанное о типах выражений применимо и к оператору присваивания.

Случайные несоответствия типов, приводящие к генерации сообще­ ний об ошибках, обычно происходят в операторах присваивания, а

не в точке действительного несоответствия. Рассмотрим следующий ВНИМАНИЕ! пример умножения:

тд(ж дежеж г d ж ж

т д ( жд o жеж x E d аж­е жж

Вторая строка этого примера приведет к генерации сообщения об ошибке, связанной с несоответствием типов, но ошибка возникла з4 2 з4 2),)2,)т 22eа не при умножении. Вот что произошло: для того чтобы выполнить умножение, С# сначала неявно преобразовал nl в тип douЫe, а затем выполнил умножение двух значений типа douЫe. В результате получилось значение того же типа douЫe.

Типы левого и правого аргументов оператора присваивания должны совпа­ дать, но тип левого аргумента не может быть изменен. Поскольку С# не может неявно понизить тип выражения, компилятор генерирует сообщение о том, что он не может неявно преобразовать тип douЫe в int. При использовании явно­ го приведения никаких проблем не возникнет:

цд(ж дoж,ж г d ь ж

тд(ж д o ж.ж сжтд( Еж,жx тEжж гж деЕжжж

(Скобки необходимы, потому что оператор приведения имеет очень высокий приоритет.) Такой исходный текст вполне работоспособен, так как ?,тли пони­ жение разрешено. Здесь значение n l будет повышено до douЫe, выполнено умножение, а результат типа douЫe будет понижен до int. Однако в этой си­ туации необходимо задуматься о душевном здоровье программиста, поскольку написать просто 5*nl было бы проще как для программиста, так и для С#.

Перегрузка операторов

Чтобы жизнь не казалась медом, знайте: поведение любого оператора мож­ но изменить с помощью функциональной возможности С#, которая называется зи4и: 4­v rл , лзи4)eл 4) (operator overloading). Перегрузка оператора, по сущес­ тву, определяет новую функцию, которая выполняется в любой момент, ког­ да вы используете оператор в проекте, где определена перегрузка. Перегрузка оператора на самом деле проще, чем кажется. Если вы пишете код

lt сжWж еж o-жжo

UO ЧАСТЬ 1 Основы программирования на С#

=

=

=

*(====RI(RI(- S ==A((-)( ( (*( *= (S(*(RI(*(;() =H==(RI==E(-

RI(S(=(=)=-v== (==uA==( (===RI(==;(H=)(

S=())*=(RI(S(*(S)=(RI==(;(

)= -(RI(-(RI=;) {v )(;( (====H(=v(==RIH)RI(==)((=RI= )(=RI)v==;( RI(*=u

H=u(RI=RI()-(RI=H(=-(=)(=RI===--)*(H())=

RI(-(RI(v-(=(RI(;(=(RI===S(

=(=)=- (S*=-(*(==) =H(=(=RI=;=(==

H=-(=(RI(S(*((d*(v(=)RI=

(S( (RI(*v==mRI(a(;=(==(v==v(=(H=()==

()=

ГЛАВА 4 Операторы Ul

Уп р а вл е н и е п ото ко м в ь1 п ол н е н и я

В ЭТО Й ГЛ А В Е . . .

)) Что делать, если . . .

)) Что делать иначе. . .

)) Циклы ТЭарЕйи уыйо тТЭавЕо й ой

)) Использование в_ое и область видимости

иоеннри)сор нВовтвwтв есинй в есирсерртЯ

ВВ

l

о

a

 

ВВ

l а

 

а a

B

 

В В

N

 

, a

ВВ

 

а а

а ' Д

i

_

ВВ

l а

 

а

N

 

 

а

 

N Pаia

Соседние файлы в папке Информатика