Приоритеты (ранги) операций

Ведение

Язык СИ был разработан в 1972 году Денисом Ритчи при создании операционной системы UNIX. Язык был создан как инструмент для программистов-практиков.

Достоинства языка СИ:

1) Он включает в себя те управляющие структуры, которые рекомендуются теоретическим и практическим программированием. Его структура побуждает программиста использовать в своей работе нисходящее проектирование, структурное программирование и пошаговую разработку модулей. Результатом такого подхода является надёжная и читаемая программа.

2) Это эффективный язык. Программы на языке СИ отличаются компактностью и быстротой исполнения.

3) Переносимый язык.

4) Мощный и гибкий язык. На нём можно писать программы для решения задач вычислительного характера, экономических, создание ОС и трансляторов с языков программирования.

Структура программы.Любая программа на языке СИ/СИ++ представляет собой совокупность функций. Одна из функций является главной. Именно с главной функции начинается выполнение программы (см. рис. 1).

Пример программы.

//директивы препроцессора

#include <stdio.h>

#include <math.h>

// функция вычисления длины отрезка

float dl(float x1, float y1,float x2, float y2)

{ float l, a, b;

a=x1-x2; a=a*a;

b=y1-y2; b=b*b;

l=sqrt(a+b);

return l;

}

Приоритеты (ранги) операций - student2.ru

Рис. 4.1. Структура программы на СИ

//основная программа

void main( )

{

float xa, ya, xb, yb, xc, yc;

float ab, bc, ac, p, S;

printf(“/n Введите координаты вершин треугольника”);

scanf(“%f%f%f%f%f%f”,&xa,&ya,&xb,&yb,&xc,&yc);

ab=dl(xa,ya,xb,yb); bc=dl(xb,yb,xc,yc); ac=dl(xa,ya,xc,yc);

p=0.5*(ab+bc+ac);

S=sqrt(p*(p-ab)*(p-bc)*(p-ac));

printf(“/nПлощадь треугольника равна %6.2f”,S);

}

Этапы работы с программой в системе программирования(рис.2 — прямоугольниками изображены системные программы, а блоками овальной формы — файлы на входе и выходе этих программ).

Приоритеты (ранги) операций - student2.ru

Рис. 4.2. Этапы работы с программой

С помощью текстового редактора создаётся текст программы и сохраняется в файле с расширением .cpp. Этот файл называется исходным. Например, решение задачи нахождения площади треугольника, заданного координатами вершин, рассмотренного выше можно сохранить в файле primer.cpp. Затем этот файл обрабатывается препроцессором. В результате такой обработки происходят препроцессорные подстановки и подключения заголовочных файлов. В нашем примере подключаются стандартная библиотека ввода-вывода и математическая библиотека. После препроцессорной обработки расширенный текст программы поступает на компиляцию. В результате компиляции в тексте программы могут быть обнаружены синтаксические ошибки, которые должен устранить разработчик, а в случае успешной компиляции создаётся объектный код программы. В нашем примере будет создан файл primer.obj. Объектный код поступает на вход компоновщика (Linker) — этот этап еще называют редактированием связей. На данном этапе к программе подключаются библиотечные функции и создаётся исполняемая программ — файл с расширением .exe. В нашем примере будет создан файл primer.exe.

Состав языка

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

Символы (алфавит) — это основные неделимые знаки, с помощью которых пишутся все тексты.

Лексема — минимальная единица языка, имеющая самостоятельный смысл.

Выражение задаёт правило вычисления некоторого значения.

Оператор задаёт законченное описание некоторого действия.

Группа операторов составляю блок или составной оператор. В этом случае эта группа операторов рассматривается как один оператор.

Все операторы делятся на исполнимые и неисполнимые. Исполнимые операторы задают действия над данными. Неисполнимые операторы — операторы описания.

Приоритеты (ранги) операций - student2.ru

Рис. 4.3. Структурные единицы программы

Алфавит. В алфавит языка СИ/С++ входят

· большие и маленькие латинские буквы;

· цифры;

· специальные символы: “ { } , . | [ ] ( ) + - / % \ ; ‘ : ? < = > _ ! & # ~ ^ * пробел;

· комбинация символов: ++ -- == || << >> <= >= += -= *= |= ?: |* */ // интерпретируется как один символ.

Из символов алфавита формируются лексемы. В языке 6 классов лексем:

· идентификаторы — последовательность латинских букв, цифр, символов подчёркивания ( _ ), начинающаяся с буквы или символа подчёркивания, например: KOM_6, __abc, A_B_C, MAX, Max.

Заглавные и маленькие буквы различаются. Поэтому МАХ и Мах — это два различных идентификатора. Рекомендуется выбирать имя идентификатора так, чтобы оно несло смысловую нагрузку. Длина идентификатора может быть любой. Компилятор различает первые 31 символ (в некоторых реализациях только первые 8 символов).

· служебные (ключевые) слова — это идентификаторы, зарезервированные в языке программирования. Полный список служебных слов зависит от реализации языка. Ядро служебных слов состоит более чем из 50 слов. Существуют служебные слова, начинающиеся с одного или двух знаков подчёркивания, поэтому программисту не рекомендуется начинать свои идентификаторы с это знака. Служебные слова нельзя использовать в качестве свободно выбираемых идентификаторов.

· константы;

· строковые константы;

· операции (знаки операций);

· разделители (знаки пунктуаций).

Типы данных

Любая программа работает с данными (величинами) — числами, символами, то есть с объектами, которые несут в себе информацию, предназначенную для использования. Некоторые данные устанавливаются равными определённым значениям до того, как программа начнёт выполняться. После запуска программы на выполнение их значения изменять нельзя. Эти величины называются константами. Величины, значения которых определяются во время выполнения программы, называются переменными.

Приоритеты (ранги) операций - student2.ru

Рис. 4

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

Различают скалярные и составные типы данных (см. рис. 4.5).

В СИ имеется небольшое количество простых типов данных:

· целочисленные типы — char, int;

· вещественные типы — float, double.

Приоритеты (ранги) операций - student2.ru

Рис. 4.5. Структура типов данных СИ

Размер памяти, отводимой под данное соответствующего типа, зависит от размера машинного слова операционной системы, в которой работает компилятор. Размер памяти под данное типа int в 16-разрядных ОС (MS DOC) — 2 байта, в 32-разрядных (Windows) — 4 байта.

Тип Размер в байтах Диапазон значений Допустимые операции
  char     -128 …+127 Над данными целого типа: %, >>, <<, &, |, ^, ~, >>=, <<=, &=, |=, ^=, &&, ||, ! Над данными всех числовых типов: +, - (бинарный и унарный), *, /, =, +=, *=, /=, ++, --, >, <, >=, <=, ==, !=
  int      
  float     ±(3.4E-38 … 3.4E+38)
  double     ±(1.7E-308 … 1.7E+308)

Специального логического типа в стандарте языка СИ нет. В качестве логических выступают числовые значения. Их преобразование в логические производятся по правилу: 0 — ложь, все остальные значения, отличные от нуля , — истина.

Величины типа char могут рассматриваться и как символы, и как целые со знаком. В случае интерпретации величины типа char как символа ее числовое значение равно ASCII-коду.

Для образования типов, производных от простых имеются модификаторы

1) знака: signed (знаковый), unsigned (беззнаковый);

2) размера: shot (короткий), long (длинный).

Модификаторы могут комбинироваться, например, unsigned long int. Но не все модификаторы могут комбинироваться со всеми. Некоторые модификаторы могут использоваться, но смысла не иметь в конкретной реализации. Например, shot int не имеет смысла, так как это сочетание эквивалентно просто описанию int. Следующая схема иллюстрирует синтаксически допустимые комбинации типов и модификаторов (см. рис. 6).

Приоритеты (ранги) операций - student2.ru

Приоритеты (ранги) операций - student2.ru

Рис. 4.6. Допустимые комбинации типов

Описание переменных

Описание переменных в программах на языке Си/С++ имеет вид

<имя_типа> <список_переменных>;

Примеры описаний:

char symbol, cc;

unsigned char code;

int number, row;

unsigned long long_number;

float x, X, cc3;

double e, b4;

long double max_num;

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

<имя типа> <имя_переменной> = <начальное_значение>;

Например:

unsigned int year=2000;

или для нескольких переменных

float pi=3.14159, c=1.23;

Общий вид списка переменных в операторе описания переменных

<список переменных> ::= <имя переменной> | <имя переменной> = <начальное значение>|[,<список переменных>];

Значения переменных могут быть константы. Рассмотрим их запись подробно.

Запись целых констант.

Целые десятичные числа, начинающиеся не с нуля. Например: 4, 356, -128.

Целые восьмеричные числа, запись которых начинается с нуля. Например: 016, 077.

Целые шестнадцатеричные числа, запись которых начинается с символов 0х, или 0Х. Например: 0х1А, 0Х253, 0хFFFF.

Тип константы компилятор определяет из контекста по следующим правилам:

1) если значение константы лежит в диапазоне типа int, то она получает тип int;

2) если значение выходит за диапазон типа int, топроверяется, лежит ли константа в диапазоне типа unsigned int. Если ответ положительный, то она получает этот тип;

3) если значение выходит за диапазон типа unsigned int, то проверяется приналежность к типу long и, наконец, unsigned long.;

4) если значение числа не укладывается в диапазон типа unsigned long, то возникает ошибка компиляции.

Запись вещественных констант. Если в записи числовой константы присутствует десятичная точка (2.5) или экспоненциальное расширение (1Е-8), то компилятор рассматривает ее как вещественное число и ставит ей в соответствие тип double. Примеры вещественных констант: 44. 3.14159 44Е0 1.5Е-4 .

Использование суффиксов.

Программист может явно задать тип константы, используя для этого суффиксы. Существует три вида суффиксов: F(f) – float; U(u) – unsigned; L(l) – long (для целых и вещественных). Кроме того, допускается совместное использование суффиксов U и L в вариантах UL или LU. Примеры:

3.14159F – константа типа float, под которую выделяется 4 байта памяти;

3.14L – константа типа long double, занимает 10 байт;

50000U – константа типа unsigned int, занимает 2 байта памяти (вместо 4-х без суффикса);

0LU – константа типа unsigned long, занимает 4 байта;

24242424UL - константа типа unsigned long, занимает 4 байта.

Запись символьных и строковых констант. Символьные константы — это символ, заключенный в апострофы. Например: ¢A¢, ¢a¢, ¢5¢, ¢+¢. Строковые константы — это символ или последовательность символов, заключенные в двойные кавычки. Например: ²rezult², ²введите исходные данные², ²А². Под символьную константу отводится 1 байт памяти, а под строковую на 1 байт больше, чем количество символов в записи константа.

Особую разновидность символьных констант представляют, так называемые, управляющие символы. Их назначение – управление выводом на экран. Такие символы расположены в начальной части кодовой таблицы ASCII (коды от 0 до 31), и не имеют графического представления. В программе на СИ они изображаются парой символов, первый из которых ¢\¢ - обратный слеш. Вот некоторые из управляющих символов: ¢\n¢ – переход на новую строку; ¢\t¢ – горизонтальная табуляция; ¢\a¢ – подача звукового сигнала. Полный список управляющих символьных последовательностей будет дан позднее.

Управляющие символьные последовательности являются частным случаем эскейп-последовательностей (ESC-sequence), с помощью которых можно задать символьную константу указанием ее кода. Код символа можно указать в восьмеричном или в шестнадцатеричном представлении. Формат восьмеричного представления:¢\ddd¢. Здесь d – восьмеричная цифра (от 0 до 7). Формат шестнадцатеричного представления:¢\xhh¢ (или ¢\Xhh¢), где h – шестнадцатеричная цифра (от 0 до F). Например, константа, соответствующая заглавной латинской букве А, может быть представлена тремя способами: ¢A¢ , ¢\101¢ , ¢\x41¢.

Именованные константы (константные переменные). В программе могут использоваться именованные константы. Для их определения используется квалификатором доступа,определяемый служебным слово const. Примеры описания именованных константных:

const float pi=3.14159;

const int iMIN=1, iMAX=1000;

Определение констант на стадии препроцессорной обработки программы. Еще одной возможностью ввести именованную константу является использование препроцессорной директивы #define в следующем формате:

#define <имя константы> <значение константы>

Например:

#define iMIN 1

#define iMAX 1000

Тип констант явно не указывается и определяется по форме записи. В конце директивы не ставится точка с запятой.

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

Х=iMAX – iMIN;

то в результате препроцессорной обработки он примет вид:

X=1000 – 1;

При этом идентификаторы iMAX и iMIN не требуют описания внутри программы.

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

enum {A, B, C, D};

В результате имени A будет сопоставлена константа 0, имени B – константа 1, C – 2, D – 3. По умолчанию значение первой константы равно нулю.

Для любой константы можно явно указать значение. Например:

enum {A=10, B, C, D};

В результате будут установлены следующие соответствия: A=10, B=11, C=12, D=13.

Возможен и такой вариант определения перечисления:

enum {A=10, B=20, C=35, D=100};

Если перечисляемому типу дать имя, то его можно использовать в описании переменных. Например:

enum metal {Fe, Co, Na, Cu, Zn};

metal Met1, Met2;

Здесь идентификатор metal становится именем типа. После такого описания в программе возможны следующие операторы:

Met1=Na; Met2=Zn;

Операции

Для исключения путаницы в понятиях "операция" и "оператор", отметим, что оператор - это наименьшая исполняемая единица программы. Различают операторы выражения, действие которых состоит в вычислении заданных выражений (например: a = sin(b)+c; j++;), операторы объявления, составные операторы, пустые операторы, цикла и т.д. Для обозначения конца оператора в языке Си используется точка с запятой. Составной оператор (или блок), представляет собой набор логически связанных операторов, помещенных между открывающей ({) и закрывающей (}) фигурными скобками ("операторными скобками"). За составным оператором точка с запятой не ставится. Блок отличается от составного оператора наличием определений в теле блока.

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

Различают унарные и бинарные операции. У первых из них один операнд, а у вторых - два. Все операции можно разбить на три групп:

1) Арифметические операции.

2) Логические операции и операции отношения.

3) Операции с битами.

Рассмотрим одну из основных операций - операцию присваивания (=). Выражение вида

х = у;

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

x = y = z = 100;

Операция присваивания имеет самый низкий приоритет среди всех операций. Она является правоассоциативной. Это означает, что несколько подряд расположенных операций присваивания выполняются справа налево. В примере сначала переменной z присвоится значение 100, затем это значение присвоится переменной y и в последнюю очередь будет определено значение переменной x. Кроме простой операции присваивания в языке имеется сложная операция присваивания, которая будет рассмотрена дальше.

Арифметические операции. К арифметическим операциям относятся:

– вычитание или унарный минус;

+ сложение или унарный плюс;

* умножение;

/ деление;

% деление по модулю (аналог mod в Паскале);

++ унарная операция увеличения на единицу (инкремент);

-- унарная операция уменьшения на единицу (декремент).

Все операции, кроме деления по модулю, применимы к любым числовым типам данных. Операция % применима только к целым числам.

Рассмотрим особенности выполнения операции деления. Если делимое и делитель – целые числа, то и результат – целое число. В этом случае операция “/ ” действует аналогично div в Паскале. Например, выражение 7/3 даст в результате 2; а при вычислении 1/5 получится 0.

Если хотя бы один из операндов имеет вещественный тип, то и результат будет вещественным. Например, операции 5./3, 5./3., 5/3. дадут вещественный результат 1.6666…

Операции инкремента и декремента могут применяться только к переменным, и не могут – к константам и выражениям. Операция «++» увеличивает значение переменной на единицу, операция «--»уменьшает значение переменной на единицу. Оба знака операции могут записываться как перед операндом (префиксная форма), так и после операнда (постфиксная форма), например: ++Х или Х++, --а или а--. Три следующих оператора дают один и тот же результат:

x = x + 1; ++x; x++.

Различие проявляется при использовании префиксной и постфиксной формы в выражениях. Проиллюстрируем это на примерах. Первый пример:

a = 3; b = 2;

c = a++ * b++;

В результате выполнения переменные получат следующие значения: a=4, b=3, c= 6.

Второй пример:

a = 3; b = 2;

c = ++a * ++b;

Результаты будут такими: a=4, b=3, c=12.

Объяснение следующее: при использовании постфиксной формы операции ++ и - - выполняются после того, как значение переменной было использовано в выражении. А префиксные операции – до использования. Поэтому в первом примере значение переменной с вычислялось как произведение 3 на 2, а во втором – как произведение 4 на 3.

По убыванию старшинства арифметические операции расположены в следующем порядке:

1) ++, – –

2) – (унарный минус)

3) *, /, %

4) +, –

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

Операции отношения. В Си используется набор операций отношения, что и в любом языке программирования. Следует лишь обратить внимание на различие в записи операций «равно» и «не равно».

< меньше,

<= меньше или равно,

> больше,

>= больше или равно,

== равно,

!= не равно.

Как уже говорилось раньше, в стандарте Си нет логического типа данных. Поэтому результатом операции отношения является целое число: если отношение истинно – то 1, если ложно – то 0.

Примеры отношений:

a<0, 101>=105, ‘a’==’A’, ‘a’!=’A’

Результатом 2-го и 3-го отношений будет 0 – ложь; результат 4-го отношения равен 1 – истина; результат первого отношения зависит от значения переменной а.

Логические операции. Три основные логические операции в

языке Си записываются иначе так

! операция отрицания (НЕ),

&& конъюнкция, логическое умножение (И),

|| дизъюнкция, логическое сложение (ИЛИ).

Правила их выполнения определяются таблицей истинности

А В А&&B A||B !A

Например, логическое выражение, соответствующее системе неравенств: 0<x<1 в программе на Си запишется в виде следующего логического выражения:

x>0 && x<1

Обратите внимание на то обстоятельство, что здесь не понадобились круглые скобки для выделения операций отношения. В отличие от Паскаля, где операции отношения имеют самый низкий приоритет, в Си операции отношения старше конъюнкции и дизъюнкции. По убыванию приоритета логические операции и операции отношения расположены в следующем порядке:

1) !

2) > < >= <=

3) = = !=

4) &&

5) ||

Битовые операции.Битовые операции можно применять к переменным, имеющим типы int, char, а также их вариантам (например, long int). Их нельзя применять к переменным типов float, double, void (или более сложных типов). Эти операции задаются следующими символами:

~ (поразрядное отрицание)

& (поразрядное "И")

| (поразрядное "ИЛИ")

^ (поразрядное исключающее "ИЛИ")

<< (сдвиг влево)

>> (сдвиг вправо).

Результат первых четырех операций определяется таблицей истинности. Для первых трех операций эта таблица совпадает с таблицей истинности соответствующих логических операций. Для исключающего «ИЛИ» таблица истинности выглядит так

А В А^B

Примеры: если a=0000 1111 и b=1000 1000, то

~a = 1111 0000,

a & b = 0000 1000,

a ^ b = 1000 0111,

a | b = 1000 1111.

Сдвиг влево эквивалентен умножению на 2 в степени, указанной в качестве второго операнда.

Пример: если а=510= 000001012, то а<<2 = 000101002 = 2010=5*22.

Если первый операнд при сдвиге вправо положительный, то результат сдвига равен умножению на 2 в степени. Если первый операнд — отрицательный, то при сдвиге вправо освобождающиеся разряды заполняются или знаком (арифметический сдвиг), или 0 (логический сдвиг). Все зависит от конкретной реализации.

Операция явного преобразования типа.Применение этой операции имеет следующий формат:

(имя_типа) операнд

Операндом может быть константа, переменная, выражение. В результате выполнения значение операнда преобразуется к указанному типу. Примеры использования преобразования типа:

(long)8, 1/(float)2.

По поводу последнего выражения заметим, что приоритет операции «тип» выше деления (и других бинарных арифметических операций), поэтому сначала значение целой константы 2 приведется к вещественному типу, а затем выполнится деление.

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

float c;

int a=1, b=2;

c=(float)a/b;

В результате переменная с получит значение 0.5. Без преобразования типа ее значение стало бы равно 0.

Операция sizeof. Эта операция имеет две формы записи:

sizeof(тип) и sizeof(выражение)

Результатом операции является целое число, равное количеству байт, которое занимает в памяти величина явно указанного типа или величина, полученная в результате вычисления выражения. Последняя определяется также по типу результата выражения. Хотя по форме записи это похоже на функцию, однако sizeof является именно операцией. Ее приоритет выше, чем у бинарных арифметических операций, логических операций и отношений. Примеры использования операции:

sizeof(int) результат – 2

sizeof(1) результат – 2

sizeof(0.1) результат – 8

sizeof(1L) результат – 4

sizeof(char) результат – 1

sizeof(‘a’) результат – 2.

Операция запятая.Эта необычная операция используется для связывания нескольких выражений в одно. Несколько выражений, разделенных запятыми «,» вычисляются последовательно слева направо. В качестве результата такого совмещенного выражения принимается значение самого правого выражения. Например, если переменная Х имеет тип int, то значение выражения (Х=3, 5*Х) будет равно 15, а переменная Х примет значение 3.

Операция условие «?:» Это единственная операция, которая имеет три операнда. Формат операции:

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

Данная операция реализует алгоритмическую структуру ветвления. Алгоритм ее выполнения следующий: первым вычисляется значение выражения 1, которое обычно представляет собой некоторое условие. Если оно истинно, т.е. не равно 0, то вычисляется выражение 2 и полученный результат становится результатом операции. В противном случае в качестве результата берется значение выражения 3.

Пример 1: вычисление абсолютной величины переменной Х можно организовать с помощью одной операции:

Х<0 ? –X : X;

Пример 2: выбор большего значения из двух переменных a и b:

max=(a<=b)?b:a;

Пример 3: заменить большее значение из двух переменных a и b на единицу:

(a>b)?a:b=1;

Правила языка в данном случае позволяют ставить условную операцию слева от знака присваивания.

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

<переменная> <знак> = <выражение>

<знак> обозначает один из знаков: +, -, *, /, %, <<, >>, &, ^, |.

Приоритет их такой же, как и у простого присваивания. Примеры использования этих операций:

a+=2 эквивалентно a=a+2,

x– =a+b эквивалентно x=x – (a+b),

p/=10 эквивалентно p=p/10,

m*=n эквивалентно m=m*n,

r%=5 эквивалентно r=r%5.

Заметим, что вместо выражения a=a+2 предпочтительнее писать в программе a+=2, поскольку второе выражение будет вычисляться быстрее.

Ранги операций. Всем операциям в языке СИ/С++ присвоены ранги. Чем больше ранг операции, тем ниже ее приоритет. Ранги рассмотренных операций указаны в таблице. В таблице отражено еще одно свойство операций – ассоциативность. Если одна и та же операция, повторяющаяся в выражении несколько раз, выполняется в порядке расположения слева направо, то она называется левоассоциативной; если выполняется справа налево, то операция правоассоциативная. В таблице эти свойства отображены стрелками влево и вправо

Приоритеты (ранги) операций

Ранг Операции Ассоциативность
( ) [ ] –> . ®
! ~ + – ++ – – & * (тип) sizeof (унарные)  
* / % (мультипликативные бинарные) ®
+ – (аддитивные бинарные) ®
<< >>> (поразрядного сдвига) ®
< <= >= > (отношения) ®
= = != (отношения) ®
& (поразрядная конъюнкция «И») ®
^ (поразрядное исключающее «ИЛИ») ®
| (поразрядная дизъюнкция «ИЛИ») ®
&& (конъюнкция «И») ®
|| (дизъюнкция «ИЛИ») ®
?: (условная операция)  
= *= /= %= += – = &= ^= |= <<= >>=  
, (операция «запятая») ®

Некоторые операции, присутствующие в таблице, пока не обсуждались.

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

1. Если один из операндов в выражении имеет тип long double, то остальные тоже преобразуются к типу long double.

2. В противном случае, если один из операндов в выражении имеет тип double, то остальные тоже преобразуются к типу double.

3. В противном случае, если один из операндов в выражении имеет тип float, то остальные тоже преобразуются к типу float.

4. В противном случае, если один из операндов в выражении имеет тип unsigned long, то остальные тоже преобразуются к типу unsigned long.

5. В противном случае, если один из операндов в выражении имеет тип long, то остальные тоже преобразуются к типу long.

6. В противном случае, если один из операндов в выражении имеет тип unsigned, то остальные тоже преобразуются. к типу unsigned.

7. В противном случае все операнды преобразуются к типу int. При этом тип char преобразуется в int со знаком; тип unsigned char в int, у которого старший байт всегда нулевой; тип signed char в int, у которого в знаковый разряд передается знак из сhar; тип short в int (знаковый или беззнаковый).

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

Упражнения

1. Определить тип константы:

а) 315 б)-32.4 в)102408 г)3.7Е57 д)0315

е )0х24 ж)2.6L з)70700U и)’5’ к)’\121’

2.В программе объявлена переменная: int n=10; Определить результаты вычислений следующих выражений:

а)n++ б)++n в)n%2 г)n/3 д)n/3.

е)++n+5 ж)5+n++ з)(float)n/4 и)sizeof(n) к)sizeof(1.*n)

3. Координаты точки на плоскости заданы переменными X и Y. Записать следующие условия в форме логических выражений:

а) точка лежит в первой четверти координатной плоскости;

б) точка лежит на оси Х;

в) точка лежит на одной из осей;

г) точка лежит в 1-й или 2-й четверти внутри единичной окружности;

д) точка лежит на единичной окружности в 3-й или 4-й четверти;

е) точка лежит внутри кольца с внутренним радиусом 1 и внешним радиусом 2 во 2-й или 4-й четверти.

4. В программе объявлена переменная: float x=2.; Какое значение получит переменная x в результате вычисления следующих выражений:

а)x+=2 б)x/=10 в)x*=(x+1) г)x+=x+=x+=1

5. Определить значения выражений для трех вариантов объявления переменной x: 1) float x=1.; 2) float x=10.; 3) int x=1:

а) x>1?2*x:x б) x/5==2?5:x/10 в)x>0&&x<=1?1:0

Наши рекомендации