- •Внимание! Рекомендуется всегда инициализировать переменные при описании.
- •Внимание
- •Замечание
- •Умножение, деление и остаток от деления (лаб2)
- •Сложение и вычитание
- •Операции сдвига
- •Операции отношения и проверки на равенство
- •Замечание
- •Поразрядные логические операции
- •Условные логические операции
- •Замечание
Условные логические операции
Условные логические операции И (&&) и ИЛИ (||) чаще всего используются с операндами логического типа. Результатом логической операции является true или false. Операции вычисляются по сокращенной схеме.
Результат операции логическое И имеет значение true, только если оба операнда имеют значение true.
Результат операции логическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true.
ВНИМАНИЕ
Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется. Например, если первый операнд операции И равен false, результатом операции будет false независимо от значения второго операнда, поэтому он не вычисляется.
Пример применения условных логических операций представлен в листинге 3.7.
Условная операция
Условная операция (? :) — тернарная, то есть имеет три операнда. Ее формат:
операнд_1 ? операнде : операнд_3
Первый операнд — выражение, для которого существует неявное преобразование к логическому типу. Если результат вычисления первого операнда равен true, то результатом условной операции будет значение второго операнда, иначе — третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться.
Тип результата операции зависит от типа второго и третьего операндов:
если операнды одного типа, он и становится типом результата операции (Это наиболее часто используемый вариант применения тернарной операции.);
иначе, если существует неявное преобразование типа от операнда 2 к операнду 3, но не наоборот, то типом результата операции становится тип операнда 3;
иначе, если существует неявное преобразование типа от операнда 3 к операн ду 2, но не наоборот, то типом результата операции становится тип операнда 2
иначе возникает ошибка компиляции.
Условную операцию часто используют вместо условного оператора if для сокращения текста программы.
Пример применения условной операции: требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает n, а иначе принимала значение 1. Это удобно реализовать следующим образом:
i = (i < n) ? i + 1: 1;
Условная операция правоассоциативна, то есть выполняется справа налево. Например, выражение а ? b : с ? d : е вычисляется как а ? b : (с ? d : e). Строго говоря, такой «хитрой» записи следует избегать. Программа не должна напоминать шараду.
Операции присваивания
Операции присваивания (=, +=, -=, *= и т. д.) задают новое значение переменной, а также свойству, событию или индексатору. Эти операции могут использоваться в программе как законченные операторы.
Формат операции простого присваивания (=):
переменная = выражение
Механизм выполнения операции присваивания такой: вычисляется выражение и его результат заносится в память по адресу, который определяется именем переменной, находящейся слева от знака операции. То, что ранее хранилось в этой области памяти, естественно, теряется. Схематично это полезно представить себе так:
Переменная <- Выражение
Напомним, что константа и переменная являются частными случаями выражения.
Примеры операторов присваивания:
а = b + с / 2;
b = а;
а = Ь:
х = 1;
х = х + 0.5;
Обратите внимание: b = а и а = b — это совершенно разные действия!
ЗАМЕЧАНИЕ
Чтобы не перепутать, что чему присваивается, запомните мнемоническое правило: присваивание — это передача данных «налево».
Начинающие часто делают ошибку, воспринимая присваивание как аналог равенства в математике. Чтобы избежать этой ошибки, надо понимать механизм работы оператора присваивания. Рассмотрим для этого последний пример (х = х + 0.5). Сначала из ячейки памяти, в которой хранится значение переменной х, выбирается это значение. Затем к нему прибавляется 0.5, после чего получившийся результат записывается в ту же самую ячейку, а то, что хранилось там ранее, теряется безвозвратно. Операторы такого вида применяются в программировании очень широко.
Для правого операнда операции присваивания должно существовать неявное преобразование к типу левого операнда. Например, выражение целого типа можно присвоить вещественной переменной, потому что целые числа являются подмножеством вещественных, и информация при таком присваивании не теряется:
вещественнаяпеременная := целоевыражение;
Результатом операции присваивания является значение, записанное в левый операнд. Тип результата совпадает с типом левого операнда.
В сложных операциях присваивания ( +=, *-, /= и т. п.) при вычислении выражения, стоящего в правой части, используется значение из левой части. Например, при сложении с присваиванием ко второму операнду прибавляется первый, и результат записывается в первый операнд, то есть выражение а += b является более компактной записью выражения а = а + b.
Результатом операции сложного присваивания является значение, записанное в левый операнд.
ЗАМЕЧАНИЕ
В документации написано, что тип результата совпадает с типом левого операнда, если он не менее int. Это означает, что если, например, переменные а и b имеют тип byte, присваивание а += b недопустимо и требуется преобразовать тип явным образом: а += (byte)b. Однако на практике компилятор ошибку не выдает.
Напомню, что операции присваивания правоассоциативны, то есть выполняются справа налево, в отличие от большинства других операций (а = b = с означает а = (b = с)).
Линейные программы
Линейной называется программа, все операторы которой выполняются последовательно в том порядке, в котором они записаны. Простейшим примером линейной программы является программа расчета по заданной формуле. Она состоит из трех этапов: ввод исходных данных, вычисление по формуле и вывод результатов. Для того чтобы написать подобную программу, вам пока не хватает знаний о том, как организовать ввод и вывод на языке С#.
Простейший ввод-вывод
Любая программа при вводе исходных данных и выводе результатов взаимодействует с внешними устройствами. Совокупность стандартных устройств ввода и вывода, то есть клавиатуры и экрана, называется консолью. Обмен данными с консолью является частным случаем обмена с внешними устройствами.
В языке С#, как и во многих других, нет операторов ввода и вывода. Вместо них для обмена с внешними устройствами применяются стандартные объекты. Для работы с консолью в С# применяется класс Console, определенный в пространстве имен System. Методы этого класса Write и WriteLine уже использовались в ваших программах. Поговорим о них подробнее, для чего внесем некоторые изменения в листинг 2.1. Результаты этих изменений представлены в листинге 2.9.
Листинг 2.9. Методы вывода.
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleInOut
{
class Program
{
static void Main(string[] args)
{
int i = 3;
double y = 4.12;
decimal d = 600m;
string s = "Vasya";
Console.WriteLine("i=" + i); //1
Console.WriteLine("y={0} \nd={1}",y,d); //2
Console.WriteLine("s=" + s); //3
}
}
}
Результат работы программы:
i = 3
y = 4.12
d = 600
s = Vasya
До сих пор мы использовали метод WriteLine для вывода значений переменных и литералов различных встроенных типов. Это возможно благодаря тому, что в классе Console существует несколько вариантов методов с именами Write и WriteLine, предназначенных для вывода значений различных типов.
Методы с одинаковыми именами, но разными параметрами называются перегруженными. Компилятор определяет, какой из методов вызван, по типу передаваемых в него величин. Методы вывода в классе Console перегружены для всех встроенных типов данных, кроме того, предусмотрены варианты форматного вывода.
Листинг 2.9 содержит два наиболее употребительных варианта вызова методов вывода. Сначала обратите внимание на способ вывода пояснений к значениям переменных в строках 1 и 3. Пояснения представляют собой строковые литералы. Если метод WriteLine вызван с одним параметром, он может быть любого встроенного типа, например, числом, символом или строкой. Нам же требуется вывести в каждой строке не одну, а две величины: текстовое пояснение и значение переменной, — поэтому прежде чем передавать их для вывода, их требуется «склеить» в одну строку с помощью операции +.
Перед объединением строки с числом надо преобразовать число из его внутренней формы представления в последовательность символов, то есть в строку. Преобразование в строку определено во всех стандартных классах С# — для этого служит метод ToString(). В данном случае он выполняется неявно, но можно вызвать его и явным образом:
Console.WriteLine("i = " + i.ToString() );
Оператор 2 иллюстрирует форматный вывод. В этом случае используется другой вариант метода WriteLine, который содержит более одного параметра. Первым параметром методу передается строковый литерал, содержащий помимо обычных символов, предназначенных для вывода на консоль, параметры в фигурных скобках, а также управляющие последовательности (они были рассмотрены в главе 2).
Параметры нумеруются с нуля, перед выводом они заменяются значениями соответствующих переменных в списке вывода: нулевой параметр заменяется значением первой переменной (в данном примере — у), первый параметр — второй переменной (в данном примере — d) и т. д.
