Оператори Visual C # (Sharp)

Протягом всієї цієї книги ми бачили застосування різних операторів в прикладах, таких як оператор присвоювання (а = 3 ) або логічні оператори (if (a == b)) У С # є багато інших арифметичні оператори, які можна використовувати для обробки типів Крім цього, можна також визначати користувацькі оператори

Оператори віднімання (-), множення (*) і ділення (/) зазвичай застосовні тільки з числовими значеннями Ці оператори прямим чином відповідають матеміческім операторам, які ми вивчаємо в початковій школі Тепер розглянемо, що можуть робити інші арифметичні оператори

Додавання

Оператор додавання (+) застосовується для вказівки складання двох значень:

Операція складання складається з правої і лівої частин, розділених знаком раветва (=) У правій частині змінна з складається зі значенням 1 і прісваіваея змінної а

Важливо усвідомлювати роздільність лівої і правої частин виразу Розглянемо наступний код:

а = а + 1

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

Ось ще один приклад послідовного обчислення: b = а = а + 1

У цьому прикладі, значення змінної ь дорівнює значенню змінної а, яке дорівнює значенню змінної а, складеному із значенням 1

Знак додавання не означає додавання для усіх типів У разі строкових типів, знак плюс виконує операцію конкатенації:

string а = b + с

Побітові оператори

Результатом застосування Унарні оператора побітового заперечення (~) є зворотне число Цієї операції необхідно приділити особливу увагу, т к резулат не завжди очевидний Розглянемо наступний приклад:

а = ~ 8

Результатом цієї операції буде -9 Такий результат дає привід припускати, що алгоритм для визначення зворотного числа додає до вихідному числу 1 і мент знак на зворотний Такий підхід може і працювати на практиці, але це не зовсім точний опис того, що відбувається Насправді, зворотне число обчислюється за двійковим бітам У двійковому поданні число 8 виглядає таким чином:

1000

Якби число 8 було типу short, то його подання було б наступним: 0000000000001000

Звернення кожного біта дає таке значення:

1111111111110111

Так як це значення типу short, то перший біт вказує знак числа, а інші представляють саме число, таким чином, отримуючи -9

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

Розглянемо приклад використання побітових операторів Скажімо, ми хочемо кім-то чином розрізняти, високий чи людина, чи носить він капелюх і бігає Меен Для представлення таких характеристик можна застосувати булеві члени даних в наступному визначенні класу:

class PersonWithAttributes { public bool IsPersonTall public bool WearsHats public bool RunsSlowly

}

У даному визначенні класу PersonWithAttributes кожен атрибут представлений членом даних Іншим способом отримати цей же результат буде розгляд КДОГ атрибута, як довічного прапора, закодованого в клас PersonWithAttributes:

class PersonWithAttributes { public int Attributes

}

У модифікованому коді класу булеві атрибути закодовані в член даних

Attributes у вигляді бітових прапорів

Кодування атрибута у вигляді прапора просто означає привласнення соответствующи біту числа відповідного значення Для доступу до окремих бітам потрібно створити константи, які є ступенем числа 2 Таким чином, три булевих члена даних перетворюються в наступні константи:

const int isTall = 1 const int wearsHats = 2 const int runsSlow = 4

Тепер позначити людини, яка любить носити капелюхи, але не вміє швидко бігати, можна таким кодом:

PersonWithAttributes person = new PersonWithAttributes() personAttributes = isTall | runsSlow

Змінної personAttributes присвоюються значення isTall і runsSlow Так як значення isTall одно 0001, a runsSlow-0010, то результатом виконання побітовій операції логічного АБО (| ) Буде значення 0011

Результатом побітовій операції АБО над двома бітами буде одиниця, якщо будь-який з бітів дорівнює одиниці У десятковому поданні результатом даного порівняння буде число 3 Але цього числа не має значення, т к ми виконуємо питов операції

Перевірити людини на високий зріст (isTall) можна таким кодом:

if ((personAttributes &amp isTall) = 0) {

ConsoleWriteLine)&quotPerson is tall&quot)

}

! 8 Зак 555

else {

ConsoleWriteLine(&quotPerson is not tall&quot)

}

Виділений жирним шрифтом код виконує операцію побітового І (&), В корою значення isTali порівнюється з відповідним прапором в атрибутах Челекена Результатом побітовій операції І над двома бітами буде одиниця, тільки якщо обидва біти рівні одиниці У разі збігів буде повернуто ненульове значення У даному прикладі буде збіг з isTali, т к ця характеристика була присвоєна даному індивідууму

Припустимо, що ми застосуємо побітовий оператор заперечення наступним чином:

personAttributes = -personAttributes

Тоді, в результаті звернення значень бітів на протилежні, прапор для

isTali стане рівним нулю, а для wearsHat – одиниці

При операції побітового зсуву біти зсуваються зліва направо або справа подат на кількість зазначених позицій У наступному коді біти зсуваються оперором «на дві позиції вліво

int shifted = 8 shifted = shifted « 2

По виконання коду значення змінної shifte d буде дорівнювати 32 В двоіом поданні число 8 виглядає як 001000 Результатом зміщення бітів на дві позиції вліво буде двійкове значення 100000, що в десятковому форматі одно 32

А в наступному коді наводиться приклад побітового зсуву вправо:

int shifted = 8 shifted = shifted » 2

В результаті цієї операції значення змінної shifte d стане рівним двійкову 10 або десятичному 2

В основному, швидше за все, у вас не буде потреби використовувати оператори питов зсуву Якщо тільки ви не займаєтеся програмуванням апаратної частини (наприклад, взаємодія з інтерфейсом GUI), то все, для чого іспользтся прапори, можна реалізувати за допомогою булевих типів і типів struct Але на випадок, якщо вам доведеться зіткнутися з побітову операторами, ви будете знати, що вони роблять

Ділення по модулю

Оператор ділення по модулю (%) дуже корисний, коли необхідно знати залишок після виконання операції ділення Наприклад, результатом наступної операції ділення буде значення 2

int а = 12/5

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

int remainder = 12 % 5

Інкремент і декремент

Оператори інкремента (+ +) і декремента (-) можуть бути більш зручними, ніж традиційні оператори додавання і віднімання Але для їх правильного примения необхідно розуміти їх черговість Розглянемо наступний код:

int а = 2

а + +

За замовчуванням, значення змінної а буде 3 А тепер, припустимо, ми виконаємо наступний код:

class Program

{

static int Loop(int counter) { return (counter ++)

}

static void Main(string] args)

{

int count = 0

for (int cl = 0 cl &lt 10 cl ++) { count = Loop(count)

ConsoleWriteLine(&quotValue (&quot + count + &quot)&quot)

}

}

}

Може скластися враження, що, оскільки метод Loop збільшує значення, то значення змінної count збільшується Насправді ж отриманий результат буде наступним:

Value (0)

Value (0)

Value (0)

Value (0)

Value (0)

Value (0)

Value (0)

Value (0)

Value (0)

Value (0)

Тобто значення змінної count не збільшується Причина такої дивної поведінки йде з Витоків мови С, де черговість виконання ключового слова return була вище, ніж оператора + +

ПРИМІТКА

Мова програмування С був заснований в 70-х роках минулого сторіччя В даний час С зазвичай застосовується тільки для написання драйверів і подібного роду прраммного забезпечення Більшість програмістів дл я написання своїх програм м не використовує С

Щоб програма працювала належним чином, метод Loop потрібно модифікувати, як показано в наступному коді:

static int Loop(int counter) { return (++counter)

}

Оператор инкремента був винесений перед змінної identifier і тому волняется перед ключовим словом return

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*