Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Оператор присваивания и его сокращенные формы




Некоторые примеры операторов присваивания уже приводились ранее в этом разделе и в разделе «Краткая справка по языку C и разработке консольных приложений в среде Visual C++ 2008». Однако этими примерами не исчерпывается всё многообразие форм записи и правил использования операторов присваивания языка C. Ниже в данном и следующих разделах приведено более детальное рассмотрение этих вопросов.

Одним из знаков оператора присваивания, как указывалось ранее, является знак =. Справа от него записывается выражение (в частном случае константа, переменная или вызов функции), а слева – переменная, которая получит вычисленное значение выражения (правила записи и вычисления выражений представлены в следующем разделе). Например,

int I=5, K;

float X, Y=2.3;

double Z = 1.0e-2;

const float pi = 3.1415926535;

X = tan(pi/3); //X получит значение 1.732

Типы переменной и выражения могут не совпадать. В этом случае перед присваиванием значение выражения автоматически преобразуется к типу переменной. Если переменная имеет тип целый, а выражение – вещественный, то перед преобразованием типа дробная часть отбрасывается, например,

K = -tan(pi/3); //K получит значение -1

Есть и сокращенные формы операторов присваивания. Они бывают двух видов: одноместные и двуместные.

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

I--; // то же, что и оператор I = I-1;, и оператор –-I;

++I; // то же, что и оператор I = I+1;, и оператор I++;

Знаками двуместных операторов присваивания являются составные знаки, состоящие из знака операции (для числовых данных это знаки + - * / %) и знака =. Так, если X - переменная, которой присваивается новое значение, а W выражение, то оператор

X += W; // эквивалентен оператору X = X + W,
X -= W; // эквивалентен оператору X = X – W,
X *= W; // эквивалентен оператору X = X * W,
X /= W; // эквивалентен оператору X = X / W,
X %= W; // эквивалентен оператору X = X % W.

Арифметические выражения

Арифметическое выражение записывается в виде последовательности целых и\или вещественных констант, переменных и обращений к функциям, разделенных знаками арифметических операций и круглыми скобками. Обращения к функциям и вычисления выражений в скобках выполняются до операций над их результатами.

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

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

6+tan(3*3.14/4)

будет вещественное число 4.9976, так как в последней операции (+) второй операнд - вещественное число -1.0024 (значение тангенса угла, примерно равного 450),

а результатом вычисления выражения

6+(i=tan(3*3.14/4))
будет целое число 5, так как в последней операции (+) вторым операндом будет переменная i целого типа, имеющая значение -1, полученное из вещественного -1.0024 (значения tan(3*3.14/4)) преобразованием к целому при присваивании переменной i.

 

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

6+(int)tan(3*3.14/4)

Явное преобразование типа иногда приходится применять и для перехода от целого к вещественному. Например, для получения вещественного значения типа float натурального основания (e) в степени, вычисляемой выражением целого типа, например, I%3, следует использовать вызов функции exp((float)i%3).

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

В выражениях в первую очередь вычисляются обращения к функциям и содержимое круглых скобок, затем – унарные операции изменения знака (-), затем - операции типа умножения (*, /, %) в порядке слева направо, затем – операции типа сложения (+ и -) в порядке слева направо. Если двуместная операция выполняется над вещественными данными разных типов (float и double), то результат будет иметь тип, представляющий больший диапазон значений (double).

Например, для вычисления выражения

в программе можно записать

pow(sin(X),2.0f)*cos(pow(Y,3))*1.2E-4/sqrt(X)/Y/pow(Z,2.0/3.0)

Порядок вычислений поясняет следующий рисунок

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

Результатом вычисления выражения будет значение типа double, так как вещественные константы без суффикса, а также ранее объявленная переменная Z (см. выше) имеют тип double.

В C выражения могут включать операторы присваивания в различных формах.

Как и унарный минус (–), унарные операторы инкрементации (++) и декрементации
(--) имеют наивысший приоритет. Однако если операторы ++ и -- меняют значение переменной, для которой они используются, то унарный минус не меняет значения переменной, а просто использует её значение со знаком минус. Операторы ++ и -- могут быть как префиксными (знак операции записываются перед переменной), так и постфиксными (знак операции записываются после переменной). От этого зависит, будет ли соответственно или новое, или исходное значение переменной использоваться для вычисления выражения. Например, если j равно 2 и целое k равно -3, то после выполнения вычислений

i=2*k--+-++j

значением переменной i будет -9, k станет равным -4, а j – равным 3. Действия будут выполнены в следующем порядке: вначале будет выполнено ++j и j получит значение 3, затем, так как унарные операции выполняются в порядке справа налево, унарный минус сохранит значение –j, то есть -3, в некоторой дополнительной переменной, затем по части выражения 2*k при исходном значении k будет вычислено значение -6 и прибавлено к -3 (значению -j), и только потом k будет уменьшено на 1 и станет равным -4. Эти же результаты можно получить, выполнив следующие три оператора присваивания:

j=j+1; i=2*k-j; k=k-1;

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

Если в рассмотренном выражении сделать декрементацию k префиксной:

i=2*--k+-++j;

то i получит значение -11, так как до умножения на 2 переменная k будет уже иметь значение -4.

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

Например, площадь S основания и объём V цилиндра радиуса R и высотой L можно вычислить одним выражением

V=L*(S=3.1415926535*R*R)

Одним выражением можно присвоить одно и то же значение нескольким переменным, например, после вычисления выражения

X=Y=Z=3.5

переменные X, Y и Z будут иметь значение 3,5. Такая форма уменьшает текст программы и делает её более наглядной.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...