Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 4-5.doc
Скачиваний:
3
Добавлен:
18.08.2019
Размер:
377.34 Кб
Скачать

Условные логические операции

Условные логические операции И (&&) и ИЛИ (||) чаще всего используются с опе­рандами логического типа. Результатом логической операции является true или false. Операции вычисляются по сокращенной схеме.

Результат операции логическое И имеет значение true, только если оба операнда имеют значение true.

Результат операции логическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true.

ВНИМАНИЕ

Если значения первого операнда достаточно, чтобы определить результат опера­ции, второй операнд не вычисляется. Например, если первый операнд операции И равен false, результатом операции будет false независимо от значения второго операнда, поэтому он не вычисляется.

Пример применения условных логических операций представлен в листинге 3.7.

Условная операция

Условная операция (? :) — тернарная, то есть имеет три операнда. Ее формат:

операнд_1 ? операнде : операнд_3

Первый операнд — выражение, для которого существует неявное преобразование к логическому типу. Если результат вычисления первого операнда равен true, то результатом условной операции будет значение второго операнда, иначе — третье­го операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип мо­жет различаться.

Тип результата операции зависит от типа второго и третьего операндов:

  1. если операнды одного типа, он и становится типом результата операции (Это наиболее часто используемый вариант применения тернарной операции.);

  2. иначе, если существует неявное преобразование типа от операнда 2 к операн­ду 3, но не наоборот, то типом результата операции становится тип операнда 3;

  3. иначе, если существует неявное преобразование типа от операнда 3 к операн ду 2, но не наоборот, то типом результата операции становится тип операнда 2

  4. иначе возникает ошибка компиляции.

Условную операцию часто используют вместо условного оператора 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) и т. д.