KNOW INTUIT, Лекция, Изрази и операции
Можете да изтеглите проекта за тази лекциятук.
Изразитеса изградени от операнди - константи, променливи, функции - обединени от знаци за операции и скоби. Когато се изчислява израз, се определят неговата стойност и тип. Тези характеристики на израза се определят еднозначно от стойностите и типовете на операндите, включени в израза, и от правилата за оценяване на израза. Правилата са:
- приоритетниоперации,
- за операции с еднакъв приоритетредът на прилагане- отляво надясно или отдясно наляво;
- преобразуване на тип операнд и избор на реализация за претоварени операции;
- типът и стойността на резултата от извършване на операция върху дадени стойности на операнди от определен тип.
Приоритет и ред на операциите
Повечето операции в C#, техният приоритет и ред са наследени от C++. Има обаче разлики: например няма операция „ , “, която ви позволява да оцените списък с изрази; добавени проверени и непроверени операции, приложими към изрази.
Както обикновено се прави, ето таблица с приоритети на операциите, във всеки ред от която са събрани операции с един и същ приоритет, а редовете следват по ред на приоритет, от най-високия към най-ниския.
0 | Първичен | (expr), x.y, x->y, f(x), a[x], x++, x--, new, typeof(t), checked(expr), unchecked(expr) | От ляво на дясно |
1 | Единичен | +, -, !, , ++x, --x, (T)x, sizeof(t) | От ляво на дясно |
2 | Мултипликативно (умножение) | *, /, % | От ляво на дясно |
3 | Добавка (добавка) | +, - | От ляво на дясно |
4 | Shift | > | От ляво на дясно |
5 | Връзки, проверка на типа | , =, е, като | От ляво на дясно |
6 | Еквивалентност | ==, != | От ляво на дясно |
7 | Логическо И (И) | & | От ляво на дясно |
8 | Логическо изключващо ИЛИ (XOR) | ^ | От ляво на дясно |
9 | Логическо ИЛИ (ИЛИ) | От ляво на дясно | |
10 | Условно логическо И | && | От ляво на дясно |
единадесет | Условно логическо ИЛИ | От ляво на дясно | |
12 | Условен израз | ? : | От дясно на ляво |
13 | Възлагане Свързване с нула | От дясно на ляво | |
14 | ламбда оператор | => | От дясно на ляво |
Операции и методи за претоварване
Претоварване на операциятасе отнася до съществуването на няколко реализации на една и съща операция. Например операторът "+" работи по различен начин в зависимост от това дали операндите му са цели числа, дълги цели числа, цели числа с фиксирана или плаваща запетая или текстови низове.
Трябва да разберете, че операциите са специален случай на писане на класови методи. Методите на класа, подобно на операциите, могат да бъдат претоварени. Казва се, че метод на клас епретоварен, ако има множество реализации на този метод. Претоварените методи имат едно и също име, но трябва да се различават по своясигнатура. Сигнатурата на метода е списък от видове формаларгументи на метода. Така че два метода на клас с едно и също име, но различни, например, в броя на параметрите, имат различна сигнатура и отговарят на изискванията за претоварени методи.
Повечето оператори на езика C# са претоварени - един и същ оператор може да се прилага към операнди от различни типове. Следователно, преди извършване на операцията, се прави търсене на реализация, която е подходяща за тези типове операнди. Имайте предвид, че операциите обикновено се извършват върху операнди от същия тип. Ако операндите са от различни типове, тогава се извършва имплицитно преобразуване на типа на един от операндите предварително. И двата операнда могат да бъдат от един и същи тип, но все пак може да възникне преобразуване на типа, тъй като няма съответстващ претоварен оператор за дадените типове. Тази ситуация често се среща на практика, тъй като например операцията за добавяне не е дефинирана за второстепенни подтипове на аритметичен тип. Ако няма подходяща реализация на операцията за тези типове операнди и неявното прехвърляне на типове операнди е невъзможно, тогава, като правило, тази грешка се открива на етапа на компилация.
Типови преобразувания
Всеки обект (променлива), всеки операнд, когато изразът се оценява, самият израз се характеризира с двойката " style="display: inline; ">, който определя стойността на израза и неговия тип. В процеса на изчисления често се налага преобразуване на типове - необходимостта от преобразуване на двойката " style="display: inline; "> към двойката "style="display: inline; ">. Първоначалната двойка се нарича източник на трансформацията, крайната двойка е целта на трансформацията.
Необходимостта от такива преобразувания възниква, както вече беше отбелязано, в хода на оценката на израза, когато операндите се преобразуват в тип, съвместим с типа операция. трансформациятипове е необходимо в операторите за присвояване, когато типът на израза от дясната страна на оператора е преобразуван към типа, даден от лявата страна на този оператор. Семантиката на присвояването също се прилага за извиквания на метод в процеса на заместване на формални аргументи на метода с действителни параметри. Това е мястото, където се изисква преобразуване на типа.
Типовите преобразувания могат да бъдат разделени на безопасни и опасни. Безопасно преобразуване е преобразуване, за което е гарантирано, че:
- това е възможно за всички възможни стойности на източника,
- няма загуба на точност по време на преобразуването, тоест точността на присвояването съответства на точността на присвояването.
Трансформация, която не отговаря на поне едно от тези условия, се нарича опасна. Достатъчно условие за съществуването на безопасно преобразуване е например условието типът да е подтип на type. Наистина, в този случай всяка изходна стойност също е валидна целева стойност. По този начин преобразуването от тип int към тип double е безопасно. Обратната трансформация естествено би била опасна.
Някои преобразувания на типове се извършват автоматично. Такива преобразувания се наричат неявни преобразувания и често се случват при оценяване на изрази. Очевидно само безопасни преобразувания могат да бъдат имплицитни. Всяко опасно преобразуване трябва да бъде изрично указано от програмиста, който поема пълната отговорност за извършването на опасното преобразуване.
Съществуват различни начини за извършване на явни преобразувания – операция за кастинг (преобразуване към тип), методи от специалния клас Convert , специални методи ToString , Parse . Всички тези методи ще бъдат обсъдени в тази лекция.
Нека обясним как се извършват неявни трансформации, когатооценка на израза. Нека при изчисляването на някакъв израз е необходимо да се извърши събиране, където той е от тип double, и -int. Сред многобройните реализации на добавяне са операции, които извършват добавяне на операнди от тип int и добавяне на операнди от тип double, така че изборът на някоя от тези реализации на добавяне ще изисква преобразуване на типа на един от операндите. Тъй като преобразуването на типа от int в double е безопасно, а другият начин е опасно, безопасно преобразуване се избира и извършва автоматично, вторият операнд се преобразува неявно в double, операндите от този тип се добавят и резултатът от добавянето ще бъде от тип double.
Организиране на проекта за програмиране на ConsoleExpressions
Както обикновено, всички примерни кодове, които се появяват в текста, са част от софтуерния проект. Ще опиша структурата на конзолния проект, използван в тази лекция, наречен ConsoleExpressions. В допълнение към стандартния клас Program, към проекта са добавени два класа, наречени TestingExpressions и Scales. Всеки от методите на класа TestingExpressions представлява тест, който ви позволява да анализирате характеристиките на операциите, използвани при конструирането на изрази, така че този клас е колекция от тестове. Класът Scale е информативен, демонстрира как се работи с мащабите, които ще бъдат разгледани в тази лекция. За да могат да се извикват методите на тези класове, обектите на тези класове се декларират и създават в основната процедура на класа Program. След това тези обекти се използват като цел за извикване на подходящите методи. Общата схема на основната процедура и извикващите методи на класа е следната:
Всеки път, когато в текста на лекцията е необходимо да се даде пример за код, ще бъде даден или пълният текст на извикания метод,например методът Casting или отделен фрагмент от метода.