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

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

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

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

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.

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

«Практикум по программированию на языке C в среде VS C++»


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

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

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

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

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

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

sin2 ( X ) ⋅cos( Y 3) ⋅12⋅105

X Y Z 2 / 3

в программе можно записать pow(sin(X),2.0f)*cos(pow(Y,3))*1.2E-4/sqrt(X)/Y/pow(Z,2.0/3.0)

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

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 выражения могут включать операторы присваивания в различных формах.

«Практикум по программированию на языке C в среде VS 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)

«Практикум по программированию на языке C в среде VS C++»


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

X=Y=Z=3.5

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: