Особенности операции присваивания — КиберПедия 

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Особенности операции присваивания

2018-01-04 566
Особенности операции присваивания 0.00 из 5.00 0 оценок
Заказать работу

1) В простейшем и часто используемом случае она похожа на присваивание языка Pascal. Только вместо двух символов (:=) используется один символ “=” и в общем виде выглядит следующим образом:

переменная=выражение;

В этом случае присваивание можно считать самостоятельным оператором. Слева всегда записывается только переменная, поэтому ни обращение к функции, ни константу записать нельзя. Справа как частный случай выражения допускается одна константа (x=0) или только обращение к функции (y=abs(x)).

2) Можно использовать так называемое многочисленное присваивание, когда значение одного и того же выражения присваивается нескольким переменным следующим образом:

Переменная1=Переменная2=…=ПеременнаяN=Выражение;

Например, оператор R=r=v=x+y; трём переменным присваивает одно и то же значение суммы двух чисел. Напомним, что R и r — это разные переменные.

3) Для более компактной записи присваивания разрешается использовать сокращённые операторы.

Например, MySum=MySum+Number1; можно кратко записать так: MySum += Number1; Такого вида сокращения можно использовать для арифметических и битовых бинарных операций (см. в 3.2 группу 14). В общем виде

переменная = переменная операция выражение;

где слева и справа от знака = одна и та же переменная, можно записать компактнее:

переменная операция= выражение;

Здесь идентификатор переменной записывается один раз, между операцией и символом “=” не должно быть пробела. В чём преимущество такой записи? Не надо дважды повторять имя одной и той же переменной.

Такая запись предпочтительнее, если используется длинный идентификатор для переменной. Поэтому в сокращённом операторе Y*=a+b особого смысла нет, можно для начинающих использовать обычную, более понятную форму: Y=Y*(a+b);

4) Для увеличения или уменьшения на единицу можно использовать операции инкремент (++) и декремент(- -). Эти операции могут стоять как перед операндом (префиксная), так и после него (постфиксная ). Их можно использовать как самостоятельно, так и в выражении.

При самостоятельном использовании префиксная и постфиксная операции выполняются одинаково, то есть не важно, где стоит знак операции. Например, ++k; и k++; работают одинаково, и это равносильно более простой и понятной записи k=k+1; как принято в других языках. C помощью сокращённого присваивания это же можно записать и так: k+=1; Аналогично, - - number; и number - -; равносильны number=number-1; или number-=1.

В выражениях префиксная и постфиксная операции различаются.

В случае префиксной операции сначала изменяется значение переменной, перед которой стоит операция, а затем используется новое изменённое значение. Например,

int X=2, Y=5, Result; Result= X*(++Y); или с учётом приоритета Result=X*++Y; выполняется следующим образом: сначала увеличивается значение Y, то есть Y=Y+1, и при умножении используется новое значение Y, равное 6. В результате получим 2*6=12, то есть Result примет значение 12.

В случае постфиксной операции сначала используется старое значение переменной, после которой стоит операция, а затем оно изменяется. Например, пусть int X=2, Y=5, Result; Result= X*Y++; Сначала вычисляется произведение со старым значением Y, то есть Result примет значение 2*5=10, а затем значение Y увеличится и станет равным 6.

Пусть int X=2, Y=5, Result; Интерес представляет следующая запись: Result=X+++Y; Какая здесь операция — постфиксная для X или префиксная для Y? Это равносильно Result=(X++)+Y; то есть сначала выполняется сложение 2+5, а затем увеличивается X. В результате получим значение Result, равное 7, X примет значение 3, а Y не изменится. Во избежание риска в таком случае рекомендуется использовать скобки, то есть вторая запись нагляднее и надёжнее.

Замечание. Начинающие могут не использовать эти возможности, а программировать в стиле Pascal. Например, вместо Result= X*Y++; можно написать: Result= X*Y; Y=Y+1;

5) Ещё одна важная особенность присваивания, не обязательная для начинающих, была описана в 2.5 и будет использоваться при изучении других операторов. Например, в компактной записи cout<<(R=a*10)<<endl; не надо дважды записывать один и тот же идентификатор R. Это равносильно R=a*10; cout<<R<<endl;

Запись R=(W=a)*b; равносильна двум операторам: W=a; R=W*b;

Тернарная операция (?)

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

R=k>9? 100: x*y; равносильно if (k>9) R=100; else R=x*y;

Это единственная трёхместная (триадная) операция, так как для неё требуется три операнда. Общий вид операции следующий:

выражение1? выражение2: выражение3

Операция выполняется следующим образом: вычисляется выражение1; если оно истинно (любое ненулевое значение), то вычисляется выражение2, и всё выражение получает это значение; если выражение 1 ложно (нулевое значение), то вычисляется выражение3, и всё выражение получает это значение.

Эта операция не обязательно должна быть связана с присваиванием. Например, в cout можно записать выражение, а в нём при необходимости разрешается использовать эту операцию без дополнительного присваивания значения выражения. Например: cout<<(x>0 && y>x? x*y: x+y); в зависимости от значений x и y выведут их произведение или сумму. Это равносильно if (x>0 && y>x) cout<<(x*y); else cout<<(x+y).

Не для любого оператора if можно записать тернарную операцию. Во-первых, её можно использовать для замены только полной формы условного оператора. Во-вторых, в одной и другой ветвях операции (после символов “?” и “:”) можно использовать по одному выражению, то есть это соответствует такому оператору if, в котором в каждой ветви по одному оператору.

Эта операция, как и любая другая, в выражении не обязательно должна быть единственной. Аналогично, как операцию “+” можно использовать с другой операцией, допустимо, например, следующее присваивание: R=A+(x>y? x: y)* B;

Замечание. Наличие отмеченных выше особенностей присваивания, тернарной операции и операции “запятая”(§ 6) является одной из причин того, что язык С, в том числе и С++, традиционно считается сложнее языка Pascal. На начальном этапе изучения такого рода особенности не обязательно надо использовать. Можно программировать проще, в стиле языка Pascal.

Поэтому для слабо подготовленного состава слушателей, для которых язык С++ является первым изучаемым языком, эти вопросы желательно изучать позже.

Задачи и упражнения

1. Вывести “ Yes ” или “ No ” в зависимости от того, точка с координатами x, y принадлежит области, ограниченной линиями y = – x, x =0 и y = –1, или нет (записать оператор if и операторы вывода).

if (y<= – x && x>= 0 && y>–1) cout<<"Yes";

else cout<<"No";

2. Нарисовать область плоскости, в которой и только в которой следующее логическое выражение истинно:

а) x>y && x<2 && y>-1; б) x>y || x<2 && y>-1;

в) x>y && x<2 || y>-1; г) x>y || x<2 || y>-1;

д) x>y && (x<2 || y>-1).

3. Даны два вещественных числа x, y. Вывести “ Yes ” или “ No ” в зависимости от того, точка плоскости с координатами (x, y) принадлежит кольцу, ограниченному окружностями, радиусы которых r и R (r < R) c общим центром в точке с координатами (a, b), или не принадлежит этому же кольцу.

4. Даны два вещественных числа x, y. Если точка плоскости с координатами (x, y) принадлежит треугольнику с вершинами в точках (–2, 0), (0, 2), (2, 0), то обе координаты увеличить в 10 раз, в противном случае уменьшить их на 10.

§ 4. Оператор выбора switch

Аналогичный оператор есть и в других языках (case в Pascal). Он используется, если уровень вложенности if достаточно большой (2.3). Тогда соответствующая часть программы при использовании switch становится более наглядной и легче для понимания и отладки.

Например, пусть дана z — оценка по “старой” 5-балльной системе. В зависимости от неё вывести текст “не явился”, если z =1, “не удовл.”, если z =2, “удовл.”, если z =3, и т. д.

// Первый вариант с помощью if:

if (z==1) cout<<”не явился”;

else if (z==2) cout <<”не удовл.”;

else if (z==3) cout <<”удовл.”;

else if (z==4) cout <<”хор.”;

else if (z==5) cout <<”отл.”;

else cout<<”Ошибка”;

// Второй вариант с оператором switch предпочтительнее:

switch (z)

{ case 1: cout<<”не явился”; break;

case 2: cout <<”не удовл.”; break;

case 3: cout <<”удовл.”; break;

case 4: cout <<”хор.”; break;

case 5: cout <<”отл.”; break;

default: cout<<”Ошибка ”;

} // Конец оператора switch.

// Здесь оператор, следующий после switch.

Работу оператора рассмотрим на нескольких тестах. Пусть z =1, тогда выводится “не явился” и с помощью break передаётся управление на оператор, следующий после switch, а остальные ветви пропускаются. Если, например, z =3, то первые две ветви пропускаются, выполняется cout <<”удовл.”; и break передаёт управление на оператор, следующий после switch. Если z не является оценкой, например, числом 30, то первые пять ветвей пропускаются, выводится “Ошибка” и выполняется оператор, следующий после switch.

Оператор switch имеет следующий общий вид:

switch (выражение)

{ case константное_выражение1:

последовательность_операторов1; break;

case константное_выражение2:

последовательность_операторов2; break;

case константное_выражениеN:

последовательность_операторовN; break;

default:

последовательность_операторов;

}

Выражение, записываемое после ключевого слова switch обязательно в скобках, может быть целого, символьного или перечисляемого типа. Чаще всего это просто целочисленная или символьная переменная. Нельзя использовать выражение вещественного или строкового типа. В константном выражении можно использовать константы, определённые одним из указанных в 3.1 способов, и нельзя записывать выражения, в том числе переменные или вызовы функций. Чаще всего здесь используется обычная целая или символьная константа.

Работает оператор следующим образом. Значения константных выражений вычисляются во время компиляции. Во время выполнения вычисляется значение выражения и сравнивается с первой константой на строгое равенство. Если не совпало, оно же сравнивается со второй константой и т. д. Если значение выражения совпало с одной из констант, выполняется соответствующая последовательность операторов, и break передаёт управление на оператор, следующий после switch. Если break отсутствует, то выполняется следующая последовательность операторов, хотя значение выражения и не совпадает со следующей константой. Обязательность break для пропуска остальных ветвей — основная особенность этого оператора по сравнению с другими языками. В случае отсутствия совпадений выполняются операторы, записанные после default, который необязателен. Если его нет, то в случае отсутствия соответствий ничего не выполняется.

В отличие от языка Pascal нельзя указать диапазон констант. Разрешается для нескольких констант указать одну и ту же последовательность операторов. Например, анализ оценок по 10-балльной системе будет выглядеть так:

switch (z){ case 1: case 2: case 3: cout <<”не удовл.”; break;

case 4:

case 5: cout <<”удовл.”; break;

case 6: case 7: case 8: cout <<”хор.”; break;

case 9: case 10: cout <<”отл.”; break;

default: cout<<”Ошибка ”;

}

При этом ключевые слова case желательно записывать в “столбик”, как это сделано во второй ветви.

Допускается вложенность операторов switch, когда в любой последовательности операторов используется другой оператор switch. Константы или значения константных выражений внутреннего и внешнего операторов switch могут совпадать. На одном уровне switch они должны быть различными. Допустима следующая часть программы:

char flag1, flag2; ……

switch (flag1)

{ case ‘A’: switch (flag2)

{ case ‘A’: cout<<”AA”; break;

case ‘B’: cout<<”AB”; }

break;

case ‘X’:

}

Задачи и упражнения

1. В зависимости от номера месяца вывести одно из слов: зима, весна, лето или осень.

2. В зависимости от номера месяца получить номер квартала.

3. Дано целое число. В зависимости от его значения вывести в правильном падеже какое-нибудь заданное слово. Например, 563 символа, 1713 символов, 91 символ и т. п.

4. Вывести заданное целое положительное число a прописью:

а) a<100, то есть число не более чем двухзначное;

б) a<1000, то есть число не более чем трёхзначное.

Например, 145 — сто сорок пять, 26 — двадцать шесть, 7 — семь.

5. Дано целое положительное число, меньшее, чем 1 000 000 000. Вывести это число, отделив пробелом каждую тысячу, а также вывести его прописью, добавив слово рубль (рубля, рублей). Например, 24 514 230 — двадцать четыре миллиона пятьсот четырнадцать тысяч двести тридцать рублей.

6. Сравнить оператор switch с аналогичным оператором case языка Pascal.

Операторы цикла


Поделиться с друзьями:

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.047 с.