Автомобільний сайт - За кермом

Автомобільний сайт - За кермом

» Вирази та операції. Арифметичні висловлювання та операції У виразі які пріоритети арифметичних операцій

Вирази та операції. Арифметичні висловлювання та операції У виразі які пріоритети арифметичних операцій

Пріоритет операцій- Черговість виконання операцій у виразі, за умови, що у виразі немає явної вказівки порядку виконання операцій (за допомогою круглих дужок).

Якщо операції мають однаковий пріоритет, то черговість виконання таких операцій визначається за якістю асоціативності.

Асоціативність- Напрямок виконання операцій у разі, якщо операції мають однаковий пріоритет.

У таблиці 1 показані основні операції С++, їх пріоритет виконання і асоціативність.

Таблиця 1 - Пріоритет операцій у С++
Пріоритет Операція Асоціативність Опис
1 :: зліва направо унарна операція дозволу області дії
операція індексування
() круглі дужки
. звернення до члена структури чи класу
-> звернення до члена структури чи класу через покажчик
2 ++ зліва направо постфіксний інкремент
постфіксний декремент
3 ++ справа наліво префіксний інкремент
префіксний декремент
4 * зліва направо множення
/ поділ
% залишок від ділення
5 + зліва направо додавання
віднімання
6 >> зліва направо зрушення вправо
<< зрушення вліво
7 < зліва направо менше
<= менше чи одно
> більше
>= більше чи одно
8 == зліва направо одно
!= не дорівнює
9 && зліва направо логічне І
10 || зліва направо логічне АБО
11 ?: справа наліво умовна операція (тернарна операція)
12 = справа наліво привласнення
*= множення із присвоєнням
/= розподіл із присвоєнням
%= залишок від поділу з привласненням
+= додавання з привласненням
-= віднімання з присвоєнням
13 , зліва направо кома

Не завжди вдається запам'ятати пріоритет операцій, тому, якщо не впевнені в черговості виконання операцій у виразі, явно вказуйте черговість виконання операцій, тобто розставте круглі дужки. Розглянемо фрагмент коду, у якому значної ролі грає пріоритет операцій.

// не правильний вираз int value = 5; cout<< value += 3; //(ОШИБКА) передаем в поток вывода значение переменной value + 3

Компілятор не зрозуміє виразу в рядку 3, оскільки операція зсуву вліво має більший пріоритет, ніж операція підсумовування з присвоєнням. У результаті програму з таким виразом навіть не можна буде запустити. Суть у тому, що компілятор розуміє цей вислів не так, як ми, а зовсім по-іншому. Як міркуватиме компілятор: «У виразі дві операції, причому перша операція<< имеет больший приоритет, чем вторая += , Отже передам спочатку в потік виведення значення змінної value , а потім додам 3 к?????? А ні до чого додати 3, оскільки змінна value передається в потік виведення.» Ось у цьому і полягає помилка, а щоб її не було потрібно просто поставити круглі дужки.

// правильне вираження int value = 5; cout<< (value += 3); // передаем в поток вывода значение переменной value + 3

У такому разі, спочатку виконається вираз у круглих дужках, а потім значення змінної value передається в потік виведення.

Порядок виконання операцій при обчисленні значення виразу визначається розташуванням знаків операцій, круглих дужокі пріоритетом операцій . Операції з найвищим пріоритетом виконуються насамперед. Якщо у виразі міститься кілька операцій одного пріоритету одному й тому рівні, їх обробка проводиться відповідно до порядком виконання – справа наліво чи зліва направо. Якщо необхідно змінити порядок виконання операцій у виразі, слід використовувати круглі дужки, наприклад (x + y) * z .

Пріоритет операції команижче, ніж у решти операцій.

У наведеній нижче таблиці операції мови C++ наведено у порядку зменшення пріоритету. Операції з різними пріоритетами розділені межею.

Таблиця пріоритетів операцій

Знаки операцій

Назви операцій

Порядок виконання

підвищення пріоритету

постфіксний інкремент

постфіксний декремент

зліва направо

sizeof

(тип ) вираз та

тип (вираз)

розмір операнда в байтах

префіксний інкремент

префіксний декремент

порозрядне НЕ

логічне НЕ

унарні мінус, плюс

перетворення типу

справаліворуч

множення

залишок від поділу цілих

зліва направо

додавання

віднімання

зліва направо

зрушення вліво

зрушення вправо

зліва направо

менше або дорівнює

більше або дорівнює

зліва направо

зліва направо

порозрядне І

зліва направо

порозрядне виключне АБО

зліва направо

порозрядне АБО

зліва направо

логічне І

зліва направо

логічне АБО

зліва направо

? :

умовна

справаліворуч

*= , /= , %=

+= , - =

<<= , >>=

&= , |= , ^=

присвоєння (просте та

складова)

справаліворуч

операція кома

зліва направо

Приведення (перетворення) типу

Мова програмування С++, будучи типізованим мовою, дозволяє дуже вільно поводитися з висловлюваннями, оперуючими різними типами даних. І тут операнди висловлювання наводяться до деякого загального типу.

Автоматично виробляються лише перетворення, які перетворюють операнди з меншим діапазоном значень операнди з великим діапазоном значень, оскільки це відбувається без втрати інформації. Наприклад, якщо у виразі ival + fvalзмінна ival типу int , а змінна fval– типу float , то при виконанні операції(+ ) значення змінної ivalбуде наведено до типу float .

Вирази, в яких могла б губитися інформація, наприклад, при присвоєнні довгих цілих більш коротким або речовим цілим можуть викликати попередження (Warning), але вони допустимі (див. операцію присвоювання).

Для будь-якого виразу можна явно вказати перетворення його типу, використовуючи унарну операцію, яка називається приведенням (перетворенням) типу . Операція може бути записана у двох форматах:

(тип) вираз

тип(вираз)

Операндом операціїприведення типує вираз, що перетворюється. Пріоритет операції наведення типутакий самий, як і в інших унарних операцій. Наприклад: (longdouble) 5; (int) f ; (double) a/2 .

Якщо вираз, що розглядається, має досить складний вигляд, бажано брати його в дужки, щоб переконатися, що тип буде змінений у результату всього виразу, а не у його частини. Наприклад,

(int) x + b * c

(int) (x + b * c )

У першому випадку перетворення відноситься до змінної x , у другому – до всього виразу x+ b * c.

Вітаю вас, шановні читачі блог сайт! Минулого разу ми розглядали питання про вбудовану мову 1С:Підприємство 8. Сьогодні ми поговоримо про про пріоритети арифметичних операцій примітивних типів даних, а також розглянемо кілька поспіль арифметичних операцій. Давайте подивимося!

З програми школи, ви знайомі з тим, що найвищим пріоритетом в арифметичних операціяхє круглі дужки «()».
Якщо вираз знаходиться у круглих дужках, то перш за все буде виконуватися саме воно. Наступним за пріоритетом йдуть унарні операції "+" і "-", унарна операція означає, що вказується операція та одне значення, наприклад "-5". Третіми виконуються операції множення і розподілу й у останню чергу додавання і віднімання. Давайте розглянемо як це працює:

99+15/5*8

У цьому випадку на початку 15 буде розділено на 5, отримане число помножено на 6 і третя операція: 99 додатись до отриманого числа. Далі такий простий вираз 10+5/2+1. Зрозуміло, що першим виконаються операція поділу, далі виконаються операція складання. Якщо використовувати дужки:

(90+30)/(7+5)

У цьому випадку на початку ми складемо 90 і 30 і поділимо все це на 7+5 і в цьому випадку вираз дорівнює 10. Розглянемо інші операції, які можливі в програмному коді 1С:Підприємство 8. Можливо, ви працювали в PHP, де можливий такий оператор i++;або i-;. Це інкремент чи декремент однією одиницю. Виконання таких операторів у 1С неможливе, але можливий оператор i++1;і j-1;. Давайте розберемо їх докладніше. Це цілком нормальний оператор. Відкриємо модуль будь-якого довідника у Конфігураторі:

Конфігурація -> Довідники -> Номенклатура, правою кнопкою миші викличемо пункт Відкрити модуль об'єкту.

Щоб не було помилки, оголосимо змінну в цьому програмному коді:

A=0; b=a++1;

Якщо перевірити на синтаксичні помилки, їх не буде. Навіть якщо вираз розмістити на різних рядках:

A=0; b = a + 1;

Взагалі, переклади рядків не впливають на виконання операторів. Як працюватиме такий оператор? Компілятор мови 1С спочатку виконає унарну операцію плюса, тобто +1 дасть 1 і потім до aдодасть одиницю. Це те саме що скласти a з одиницею. Так само можна написати:

A=0; b=a+-1;

Спочатку виконується унарна операція мінуса, виходить -1, потім складається мінус і плюс і виходить -1. Відповідно це те саме, що і i-1. Потрібно знати про такі специфічні операції та розуміти, як вони будуть виконуватися. Це допоможе правильно розставляти пріоритети арифметичних операцій відповідно до того порядку, про який ми говоримо.

Отже, ми з'ясували, що система спокійно відпрацьовує операцію, де зустрічаються дві поспіль арифметичні операції, наприклад ++, +-, -+, а що буде, якщо ми напишемо кілька арифметичних операцій поспіль? Це можна перевірити. Для цього відкриємо 1С:Підприємство з Конфігуратора в режимі налагодження, клавіша F5. Поставимо крапку зупинки, клавіша «F9», в кінці нашого виразу і введемо простий вираз у табло. У Конфігураторі відкриємо пункт меню Налагодження -> Табло.

Запишемо в табло вираз 3+++5, зверніть увагу, на виході у нас виходить помилка у виразі. Платформа такого перетворення зробити не може. Вираз 3++5 спрацьовує, тоді як із трьома плюсами система не розуміє, чого саме від неї хочуть. Але якщо поставити дужки 1++(+2) , все це буде виконано коректно. Як бачимо, щоб правильно організувати роботу арифметичних операцій необхідно добре розуміти пріоритети їх виконання. У наступній статті ми розглянемо.

Лекція 4 Кафедра прикладної математики М-703, тел. 362-79-62 К.т.н., професор Глаголєв Віктор Борисович, кімн. Ж-405б, тел. 362-73-28 http://glagvik.narod2.ru/index.htm Арифметичні операції Пріоритет арифметичних операцій Математичні функції Масиви Логічні операції Пріоритет операцій


Операції та функції VB має великий набор вбудованих функцій. Їх можна розділити на кілька категорій: Фінансово-математичні функції Математичні функції Функції обробки рядків Функції перетворення типів Інші функції


Ознайомитись з докладним описом функцій можна у довідковій системі VB. Далі ми розглянемо лише математичні функції VB. У таблиці наведено повний перелік операцій, які можуть бути застосовані до числових даних.


Арифметичні операції

Операції відносини


Пріоритет операцій Якщо у виразі використано декілька операцій, то в першу чергу виконуються операції, які мають найвищий пріоритет. Якщо пріоритет операцій однаковий, вони виконуються зліва направо. a + b/c + d (a + b)/(c + d) Приклади Вираз Код


Математичні функції

Кути виражаються у радіанах. У проекті необхідно виконати імпорт простору імен System.Math, додавши на початок вихідного коду (до оголошення першого модуля чи класу) рядок Imports System.Math. Інакше перед ім'ям кожної функції необхідно додавати назву класу, наприклад: Math.Sin(x)


Імпорт у проект простору імен System.Math


Функції Int та Fix повертають значення, що дорівнює цілій частині числа, тип якого збігається з типом аргументу. Синтаксис: Int(число) і Fix(число) Обов'язковий аргумент число – це будь-яке допустиме числове вираз.


Відмінність між функціями Int і Fix полягає в тому, що для негативного значення аргументу функція Int повертає найближче негативне ціле число, менше або рівне зазначеному, а Fix найближче негативне ціле число, більше або рівне зазначеному. Наприклад, функція Int перетворює -8.4 -9, а функція Fix перетворює -8,4 -8.


Функція Rnd повертає значення типу Single, що містить випадкове число, менше 1 і більше або 0. Перед першим викликом функції Rnd треба використовувати інструкцію Randomize () без аргументу для ініціалізації генератора випадкових чисел.


приклад. Гра «Вгадай число» Умова гри Комп'ютер загадує деяке випадкове ціле число k з діапазону 0 – 100. Слід вгадати загадане число, зробивши якнайменше спроб. Після кожної спроби комп'ютер повідомляє, що задумане число більше або менше запропонованого числа.


Таблиця даних


Блок-схема алгоритму Генерація випадкового числа k від 0 до 100 Введення k1 a



Інтерфейс


Значення властивостей


Програмний код

Масиви Масив - це група змінних, що містять елементи даних одного типу та з одним ім'ям. Під кожен елемент масиву відводиться окремий осередок пам'яті. Всі елементи масиву мають один і той самий тип. Можливі посилання окремі елементи масиву. Кожен окремий елемент масиву визначається ім'ям масиву та значеннями індексів.


Наприклад, посилання a(7) або a1(2, 9) означають, що: а – це ім'я одновимірного масиву (вектора) з одним індексом, елемент масиву має значення індексу 7. а1 це ім'я двовимірного масиву (матриці). Про це свідчить застосування двох індексів визначення елемента масиву.


Перший індекс двовимірного масиву трактується як номер рядка, де знаходиться елемент масиву, а другий індекс, як номер стовпця. Індексом може бути вираз цілого типу з невід'ємним значенням. Нижня межа індексу завжди дорівнює 0. Верхня межа кожного індексу масиву визначається при його оголошенні.


Ім'я масиву Індекс (номер позиції) елемента масиву km Приклад масиву c ім'ям km типу Integer показань лічильника кілометрів на спідометрі автомобіля на початку кожного місяця протягом року:


Як і прості змінні масиви оголошуються за допомогою інструкцій Dim, Static, Private або Public. Приклади оголошення масивів: Dim x() As Single Dim y(,) As Single


Оголошено одновимірний масив з ім'ям x та двовимірний масив y. Про це говорять дужки у оголошенні після імені кожного масиву. При оголошенні двовимірного масиву між дужок має стояти кома. Оголошення верхніх меж індексів у прикладах відкладено потім (такі масиви називають динамічними). Одновимірний масив називають вектором. Двовимірний масив називають матрицею.


Для оголошення верхньої межі індексу та розміщення у пам'яті масивів слід помістити інструкцію: Redim x(10), y(4,5) Тут задані значення верхніх меж кожного індексу масивів.


Індекс масиву x може набувати значення в діапазоні від 0 до 10. Масив x має 11 елементів. Перший індекс масиву y може набувати значення в діапазоні від 0 до 4. Другий індекс масиву y може набувати значення в діапазоні від 0 до 5. Масив y має 30 елементів (твір числа рядків на число стовпців).


При оголошенні масиву можна виконати його ініціалізацію: Dim z() As Single = (1.3, -2.7, _ 14.6, -5) У цьому прикладі оголошено одновимірний масив z, що має 4 елементи, значення яких задані списком ініціалізації. Масив, при оголошенні якого верхні межі індексів були зазначені (динамічний масив), можна неодноразово переоголошувати з допомогою інструкції ReDim.


Серед інструкцій усередині процедури можна записати: ReDim y(5, 10) Далі цей масив може бути переоголошений: ReDim y(5, 20)


За допомогою інструкції ReDim можна змінювати лише верхні межі індексів. Розмір масиву (кількість індексів) можна задати один раз. Змінювати її не можна. Інструкцію ReDim можна застосовувати для зміни динамічного масиву стільки разів, скільки потрібно. Однак при кожному її застосуванні дані, що містяться в масиві, втрачаються.


Інструкція ReDim Preserve може збільшити розмір масиву, зберігаючи при цьому вміст. Наступний приклад показує, як можна збільшити розмір масиву a4 на 10 елементів без знищення поточних значень елементів масиву. Нехай був оголошений масив: Dim a4() As Integer Потім у програмі встановлено розмір цього масиву: ReDim a4(n)



Якщо при оголошенні масиву задаються верхні межі індексів, такий масив називається фіксованим. Приклад Dim s(10) As Single Dim b(4, 5) As Integer До фіксованих масивів інструкція ReDim не застосовується.


Є можливість присвоїти вміст одного масиву іншому так само, як це робиться для простих змінних. Але ці масиви повинні мати однакову розмірність та однакову кількість елементів.


Якщо ж лівої частини оператора присвоєння стоїть динамічний масив, то збіг числа елементів необов'язково. Число елементів масиву в лівій частині оператора присвоєння за потреби зміниться.


приклад. Dim a() As Integer = (1, 2, 3, 4), _ b(), i As Integer b = a For i = 0 To 3 MsgBox(b(i)) Next Послідовно на екрані у вікні функції MsgBox буде виведено: 1, 2, 3, 4.


Приклад 1 Обчислити середнє арифметичне k заданих чисел.


Вихідні дані: k – змінна цілого типу, число заданих величин; a() – масив типу Single, значення заданих величин. Результати: s – змінна типу Single, значення середнього арифметичного.


Проміжні: Сума – змінна типу Single, значення суми перших елементів масиву k; i – змінна цілого типу, значення індексу елемента масиву a.


Блок-схема алгоритму (1) (2) 1


(3) (4) (5) (6) (7) (8) 1 2 Ні



Подивимося на цю блок-схему з погляду базових структур, що до неї входять. Блоки 1 – 2 становлять послідовну структуру (слідування), що ми назвемо Структура 1. Блоки 3 – 8 ставляться до циклу. Цю структуру ми назвемо Структура 2. Блоки 9 і 10 – це послідовна структура, яку ми назвемо Структура 3.


Структура 1, Структура 2 і Структура 3, що розглядаються в сукупності є структурою слідування. У блок-схемі будь-якого структурованого алгоритму можна ясно побачити базові структури, у тому числі будується алгоритм.


Інтерфейс проекту Текстове поле призначене для виведення результатів обчислень. Натискання кнопки призведе до запуску обчислень.


Інтерфейс проекту


Код проекту При створенні проекту система автоматично створює наведену нижче заготівлю коду, пов'язаного з формою Form1, яка є оголошенням класу Form1. Весь код, пов'язаний з формою, повинен знаходитись усередині цієї заготовки.


Виконання проекту має розпочатися з клацання на кнопці BtnПуск. Отже, у код проекту повинна входити підпрограма BtnПуск_Click, виконання якої запускається подією Click, що сталася з кнопкою BtnПуск (клацанням на цій кнопці).


Наступним кроком створення коду проекту має бути включення в код проекту заготівлі підпрограми BtnПуск_Click, яка створюється системою, якщо зробити, наприклад, подвійне клацання на кнопці BtnПуск.


Нижче наведено код, який вийде після створення заготівлі підпрограми BtnПуск_Click.

Після запуску проекту виконання програмний код почне виконуватися лише після натискання на кнопки BtnПуск. У цьому випадку для цієї кнопки відбувається подія Click, що призводить до виконання подійної процедури BtnПуск_Click. Результати рішення

У рядках з 1 до 5 тіла цієї процедури оголошуються дані. У рядку 6 виконується очищення текстового поля. Для цього застосовується метод Clear. Якщо цього не зробити, то при багаторазових запусках проекту інформація, що виводиться в текстовому полі при черговому запуску, додаватиметься до інформації, виведеної в ньому під час попередніх запусків.


У рядку 7 забезпечується введення значення змінної k. Правильність виконання введення даних рекомендується завжди контролювати. Саме з цією метою у рядку 8 значення змінної k виводиться у текстовому полі. У рядку 9 виконується розміщення масиву a пам'яті.


У рядках з 10 до 12 виконується введення значень елементів масиву a. Значення елемента a(0) у своїй не вводиться. Наявність цього елементу ми ігноруватимемо. Він ніде не застосовуватиметься. У рядках з 13 до 16 значення введених елементів масиву a виводяться для контролю в текстовому полі.


У рядках з 17 до 20 виконується обчислення значення змінної s. І, нарешті, у рядку 21 забезпечується виведення значення змінної s текстовому полі.


Зверніть увагу, що в програмі немає інструкції i = 1, а також інструкції i = i + 1, незважаючи на те, що ці інструкції є в блок-схемі. Немає також перевірки умови i<= k. Выполнение всех этих действий обеспечивает инструкция цикла For … Next.


Зверніть увагу, що в програмі також немає інструкції sum = 0. Значення 0 змінна sum отримала в результаті її оголошення. Ви можете видалити інструкцію Dim i As Integer. Інструкція циклу For … Next є блоком. Змінна i всередині блоку отримає тип Integer автоматично (за типом початкового та кінцевого значень параметра), але діятиме лише всередині блоку.


Логічні операції У VB.NET визначено логічні операції: And (логічне множення), Or (логічне додавання), Not (логічне заперечення), а також Xor (логічне виняткове додавання). Операція Not має наступний синтаксис: Not Операнд


Операнд, що має логічний тип, - це відношення, змінна або функція логічного типу або результат логічної операції. Результат логічного заперечення має протилежне значення її операнда, що показує наведена далі таблиця.


Операція Not Not Операнд


Операція And має два операнди: Операнд 1 And Операнд 2 Результат операції And визначає таблиця:


Операція And має значення True тільки тоді, коли обидва операнди мають значення True. Приклад Нерівність a? x? b слід записати: a<= x And x <= b Неправильно написать: a <= x <= b


Операція Or також має два операнди: Операнд 1 Or Операнд 2 Результат операції Or дано в таблиці:


Операція Or має значення True, якщо хоча б один операнд (і обидва разом) мають значення True. Приклад: Умову «х не належить відрізку» слід записати: x< a Or x >b або Not(a<= x And x <= b)


Xor (логічне виняткове додавання) Результат операції Xor наведено в таблиці: Операція Xor має значення True, якщо один з операндів (але не обидва разом) мають значення True.


У VB.NET визначено також логічні операції: AndAlso та OrElse. Операція AndAlso дуже схожа на операцію And. Вона також виконує логічне множення для двох логічних операндів (Boolean).


Основною відмінністю між AndAlso та And є те, що AndAlso допускає скорочене, неповне обчислення операндів. Якщо для першого операнда AndAlso обчислюється значення False, другий операнд не обчислюється і повертається значення False операції AndAlso.


Аналогічно, операція OrElse дуже схожа на операцію Or. Вона виконує скорочене логічне додавання двох логічних операндів. Якщо перший операнд у виразі OrElse дорівнює True, другий операнд не обчислюється та повертається True для операції OrElse.

вираз , та правилами обчислення виразу. Правила задають:
  • пріоритетоперацій,
  • для операцій одного пріоритету порядок застосування- зліва направо чи праворуч наліво;
  • перетворення типів операндів та вибір реалізації для перевантажених операцій;
  • тип та значення результату виконання операції над заданими значеннями операндів певного типу.

Пріоритет та порядок виконання операцій

Більшість операцій у мові C#, їхній пріоритет і порядок успадковані з мови C++. Проте є й відмінності: наприклад, немає операції " , " , що дозволяє обчислювати список висловів; додано операції checked і unchecked , що застосовуються до виразів.

Як це зазвичай робиться, наведемо таблицю пріоритетівоперацій, у кожному рядку якої зібрані операції одного пріоритету, а рядки йдуть у порядку пріоритетів, від найвищого до нижчого.

Таблиця 3.1. Пріоритети операцій мови 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 Зрушення << ,>> Зліва направо
5 Відносини, перевірка типів <, >, <=, >=, is, as Зліва направо
6 Еквівалентність ==, != Зліва направо
7 Логічне І (AND) & Зліва направо
8 Логічне виключне АБО (XOR) ^ Зліва направо
9 Логічне АБО (OR) | Зліва направо
10 Умовне логічне І && Зліва направо
11 Умовне логічне АБО || Зліва направо
12 Умовний вираз ? : Справа наліво
13 Привласнення

Склеювання з null

=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= Справа наліво
14 Лямбда-оператор => Справа наліво

Перевантаження операцій та методів

Під перевантаженням операціїрозуміється існування кількох реалізацій однієї й тієї операції. Наприклад, операція зі знаком "+" виконується по-різному в залежності від того, чи є її операнди цілими числами, довгими цілими, цілими з фіксованою або плаваючою точкою або рядками тексту.

Потрібно розуміти, що операції - це окремий випадок запису методів класу. Методи класу, як і і операції, може бути перевантажені. Метод класу називається перевантаженимякщо існує кілька реалізацій цього методу. Перевантажені методи мають те саме ім'я, але повинні відрізнятися своєю сигнатурою. Сигнатуру методу становить перелік типів формальних аргументів методу. Так що два методи класу з одним ім'ям, але відрізняються, наприклад, числом параметрів, мають різну сигнатуру і задовольняють вимогам до перевантажених методів.

Більшість операцій мови C# перевантажені - та сама операція може застосовуватися до операндам різних типів. Тому перш ніж виконувати операцію, проводиться пошук реалізації, що підходить для даних типів операндів. Зауважу, що операції зазвичай виконуються над операндами одного типу. Якщо ж операнди різних типів, то попередньо відбувається неявне перетворення типуодного з операндів. Обидва операнди можуть бути одного типу, але перетворення типів може все одно відбуватися - тому, що для заданих типів немає відповідної перевантаженої операції. Така ситуація досить часто виникає на практиці, оскільки, наприклад, операція додавання не визначена для молодших підтипів арифметичного типу. Якщо для даних типів операндів немає відповідної реалізації операції і неможливе неявне приведення типів операндів, то, як правило, ця помилка виявляється ще на етапі компіляції.

Перетворення типів

Кожен об'єкт (змінна), кожен операнд при обчисленні виразу, сам вираз характеризується парою, що задає значення виразу та його тип. У процесі обчислень часто виникає необхідність перетворення типів - необхідність перетворення пари до пари . Вихідна пара називається джерелом перетворення, заключна – метою перетворення.

Необхідність у подібних перетвореннях виникає, як зазначалося, у процесі обчислення висловлювання під час приведення операндів до типу, узгодженому з типом операції. Перетворення типів необхідно в операторах присвоєння, коли тип виразу правої частини оператора наводиться до типу, заданого лівою частиною цього оператора. Семантика присвоєння має місце і за виклику методів у процесі заміни формальних аргументів методу фактичними параметрами. І тут потрібне перетворення типів.

Перетворення типів можна розділити на безпечні та небезпечні. Безпечне перетворення - це перетворення, для якого гарантується, що:

Перетворення, котрій не виконується хоча одне з цих умов, називається небезпечним. Достатня умова існування безпечного перетворення є, наприклад, умова того, що тип є підтипом типу . Справді, у разі будь-яке значення джерела є й допустимим значенням мети. Так, перетворення від типу int до типу double є безпечним. Зворотне перетворення, звісно, ​​буде небезпечним.

Деякі перетворення типів виконуються автоматично. Такі перетворення називаються неявними, і часто зустрічаються при обчисленні виразів. Очевидно, що неявними можуть лише безпечні перетворення. Будь-яке небезпечне перетворення має явно задаватися самим програмістом, який бере на себе всю відповідальність за виконання небезпечного перетворення.

Існують різні способи виконання явних перетворень - операція кастингу (приведення до типу), методи спеціального класу Convert, спеціальні методи ToString, Parse. Всі ці методи будуть розглянуті в даній лекції.

Пояснимо, як виконуються неявні перетворення при обчисленні виразу. Нехай при обчисленні деякого виразу необхідно виконати додавання, де має тип double, а-int. Серед численних реалізацій додавання є операції, що виконують додавання операндів типу int і додавання операндів типу double, так що при виборі будь-якої з цих реалізацій додавання буде потрібно перетворення типу одного з операндів. Оскільки перетворення типу від int до double є безпечним, а в інший бік це перетворення небезпечне, то вибирається безпечне перетворення, яке виконується автоматично, другий операнд неявно перетворюється на тип double, виконується складання операндів цього типу, і результат додавання буде мати тип double .

Організація програмного проекту ConsoleExpressions

Як завжди, всі приклади програмного коду, що з'являються в тексті, є частиною програмного проекту. Опишу структуру консольного проекту, що використовується в цій лекції, названого ConsoleExpressions. Крім створеного за умовчанням класу Program, до проекту додані два класи з іменами TestingExpressions і Scales. Кожен із методів класу TestingExpressions представляє тест, який дозволяє аналізувати особливості операцій, що використовуються при побудові виразів, так що цей клас є збіркою тестів. Клас Scale має змістовний характер, демонструючи роботу зі шкалами, про які йтиметься у цій лекції. Щоб мати змогу викликати методи цих класів, у процедурі Main класу Program оголошуються та створюються об'єкти цих класів. Потім ці об'єкти використовуються як ціль виклику відповідних методів. Загальна схема процедури Main та виклику методів класу така:

static void Main(string args) ( string answer = "Так"; do ( try ( TestingExpressions test = new TestingExpressions(); test.Casting(); // Виклик інших методів … ) catch (Exception e) ( Console.WriteLine( "Неможливо нормально продовжити роботу!"); Console.WriteLine(e.Message); ) Console.WriteLine("Продовжимо роботу? (Так/ні)"); answer = Console.ReadLine(); ) while (answer == " Так" || answer == "так" || answer == "yes");

Щоразу, коли в тексті лекції потрібно буде навести приклад коду, наводиться або повний текст методу, що викликається, наприклад, методу Casting , або окремий фрагмент методу.