Шаг 22.
Язык программирования C#. Начала
Базовые типы и операторы. Арифметические операторы

    На этом шаге мы перечислим эти операторы и рассмотрим особенности их использования.

    Далее мы рассмотрим основные операторы, используемые в языке С#. Начнем с арифметических операторов, используемых при выполнении арифметических операций. Вообще же все операторы в языке C# обычно разделяют на четыре группы:

    Также в языке C# есть тернарный оператор. Да и оператор присваивания не такой простой, как может показаться на первый взгляд. Все эти вопросы мы обязательно обсудим. Ну а пока - арифметические операторы.


Оператор - это некий символ, обозначающий определенную операцию. Оператор используется с операндом или операндами. Операция, определяемая оператором, выполняется с операндами. Если оператор используется с одним операндом, то такой оператор называется унарным. Если оператор используется с двумя операндами, то такой оператор называется бинарным. В языке C# также есть один оператор, который используется аж с тремя операндами. Этот оператор называется тернарным.

    Назначение большинства арифметических операторов интуитивно понятно каждому, кто хотя бы в минимальном объеме сталкивался с математикой. В таблице 1 представлен полный перечень арифметических операторов языка С#. Там же дано краткое их описание.

Таблица 1. Арифметические операторы
Оператор Описание
+ Оператор сложения. Значением выражения вила А+В является сумма значений переменных А и В
- Оператор вычитания. Значением выражения вида A-В является разность значений переменных А и В
* Оператор умножения. Значением выражения вида А*В является произведение значений переменных А и В
/ Оператор деления. Значением выражения вида A/В является частное значений переменных А и B. Если оба операнда А и B целочисленные, то деление выполняется нацело. Для выполнения обычного деления с целочисленными операндами перед выражением указывают инструкцию (double)
% Оператор вычисления остатка отделения. Значением выражения вида А%В является остаток от целочисленного деления переменных А и В
++ Оператор инкремента. При выполнении команды вида А++ или ++А значение переменной А увеличивается на 1
-- Оператор декремента. При выполнении команды вида А-- или --А значение переменной А уменьшается на 1

    Описание операторов дано в предположении, что операнд (или операнды) является числовым. Вместе с тем это не всегда так. Так, в операции сложения с использованием оператора + один или оба операнда могут быть, например, текстовыми. В таком случае выполняется объединение текстовых строк. Скажем, если к тексту прибавить число, то числовой операнд автоматически преобразуется в текстовый формат и результатом выражения является текст, получающийся объединением "суммируемых" текстовых фрагментов.

    Имеет свои особенности и оператор деления. Дело в том, что если делить два целых числа, то выполняется целочисленное деление. Например, результатом выражения 12/5 будет не 2.4, как можно было бы ожидать, а целое число 2 (целая часть от деления 12 на 5). Но вот результат выражения 12.0/5 или 12/5.0 - это число 2.4. Объяснение простое: в выражении 12/5 оба операнда целочисленные, а в выражениях 12.0/5 и 12/5.0 целочисленный только один операнд. Поэтому в выражении 12/5 речь идет о целочисленном делении, а значения выражений 12.0/5 и 12/5.0 вычисляются с использованием обычного деления. Если а и b - целочисленные переменные (например, типа int), то при вычислении выражения а/b используется целочисленное деление. Если нужно, чтобы деление было обычным, используют команду вида (double)а/b.

    Оператор % позволяет вычислить остаток от целочисленного деления. Причем операнды могут быть не только целыми, но и действительными числами. В таком случае результатом выражения вида А%В может быть не только целое, по и действительное число.


Если А и B некоторые числа (действительные, в том числе они могут быть и отрицательными), то остаток отделения А на B (обозначим эту операцию как А%В) вычисляется следующим образом. Сначала находится наибольшее по модулю целое число n, такое, что |nВ|<|А| при условии совпадения знаков А и , и результат операции А%B вычисляется как А%B = А - nB. Например, если А = 13,7 и B = 3,1, то n = 4 (nB = 12,4) и А%В = А - nB = 13,7 - 12,4 = 1,3. Если А = -13,7 и В = 3,1, то n = -4 (nB = -12,4) и А%В = А - nB = -13,7 + 12,4 = -1,3, и так далее.

    Если А и B - целочисленные переменные, то результат выражения A%B совпадает с разностью значений переменной А и выражения В*(A/В) (то есть значения выражений А%В и A-В*(A/В) в этом случае совпадают).


    Если все предыдущие операторы (+,*, / и %) были бинарными, то операторы инкремента ++ и декремента - являются унарными - они используются с одним, а не с двумя операндами. У каждого из этих операторов есть префиксная и постфиксная формы: в префиксной форме операторы инкремента и декремента указываются перед оператором (например, ++А или --А), а в постфиксной форме сначала указывается операнд, а затем - оператор (например, А++ или А--). В плане влияния на значение операнда префиксная и постфиксная формы эквивалентны. При выполнении команды вида ++А или А++ значение переменной А увеличивается на 1. Команда вида --А и А-- означает уменьшение значения переменной А на 1. Но разница между префиксными и постфиксными формами все же есть. Дело в том, что выражения вида ++А, А++, --А и А-- имеют значения. Проше говоря, инструкцию ++А или, скажем, А-- мы можем интерпретировать как некоторое число (если операнд А числовой). То есть, помимо прямых последствий для операнда, само выражение на основе оператора инкремента или декремента может использоваться в более сложном выражении. Правило такое: значением выражения с оператором инкремента или декремента в префиксной форме является новое (измененное) значение операнда, а значением выражения с оператором инкремента или декремента в постфиксной форме является старое (до изменения) значение операнда. Например, командой int А=10, В объявляются две переменные А и В, и переменная А получает значение 10. Если затем выполняется команда В=А++, то переменная В получит значение 10, а значение переменной А станет равным 11. Почему? Потому что при выполнении инструкции А++ значение переменной А увеличивается на 1 и становится равным 11. Но переменной В значением присваивается не значение переменной А, а значение выражения А++. Значение выражения А++, поскольку использована постфиксная форма оператора инкремента, - это старое (исходное) значение переменной А (то есть значение 10). А вот если бы мы вместо команды В=А++ использовали команду В=++А, то и переменная А, и переменная В получили бы значение 11. Причина в том, что значением выражения ++А с оператором инкремента в префиксной форме является новое значение переменной А (число 11).


После выполнения команд int А=10, В и В=А-- у переменной А будет значение 9, а у переменной В будет значение 10. Если команду В=А-- заменить на В=--А, то обе переменные А и В будут иметь значение 9.

    При выполнении арифметических операций, помимо числовых операндов, могут использоваться и символьные значения (значения типа char). В таком случае выполняется автоматическое преобразование значения типа char в числовое значение (используется код соответствующего символа из кодовой таблицы). В этом смысле мы вполне можем вычислить, например, разность 'D'-'А' (результат равен 3 - разность кодов символов 'D' и 'А').


Операторы инкремента и декремента также могут использоваться с символьным операндом. Но здесь есть одна особенность. Допустим, командой char symb='A' мы объявили символьную переменную symb со значением 'А'. Если мы используем выражение symb+1, то его значением является целое число 66 (к коду 65 символа 'А' прибавляется 1). Поэтому, чтобы с помощью такого выражения в переменную symb записать следующий символ после символа 'А', нужно использовать команду symb=(char)(symb+1). Буквы алфавита в кодовой таблице идут одна за другой, поэтому следующим после символа 'А' будет символ 'В', затем символ 'С' и так далее.

    Значение выражения symb+1 - число 66, которое является кодом символа 'В' в кодовой таблице. Результат выражения symb+1 явно приводится к символьному виду, и полученное число интерпретируется как код символа. В результате значением переменной symb будет символ 'В'.

    А вот если мы воспользуемся выражением symb++ (или ++symb), то значение переменной symb станет равным 'В'. Дело в том, что в плане последствий для операнда А выражение А++ (или ++А) эквивалентно команде вида А=(тип А)(А+1). То есть к исходному значению операнда А прибавляется единица, полученный результат приводится к типу операнда А, и это значение присваивается операнду А. Если операнд А - числовой, то факт приведения типа не столь важен. Но вот если операнд символьный - то момент с приведением типа важен. Это же замечание относится и к оператору декремента.



Помимо бинарных операторов сложения + и вычитания - есть еще унарные операторы "плюс" + и "минус" -. Унарный "минус" пишется перед отрицательными числами (то есть используется для обозначения отрицательных чисел). Унарный "плюс" обычно не используется, поскольку числа без знака по умолчанию интерпретируются как положительные, но в принципе его можно писать.

    На следующем шаге мы рассмотрим операторы сравнения.




Предыдущий шаг Содержание Следующий шаг