Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DOROGOVA.pdf
Скачиваний:
245
Добавлен:
05.06.2015
Размер:
853.4 Кб
Скачать

Вопросы для самопроверки

1.Какие символы не входят в алфавит языка Си?

2.Для чего нужны "пробельные символы"?

3.Для чего нужны "управляющие символы"?

4.Поясните понятие "ключевые слова", назовите основные группы ключевых слов.

5.Перечислите правила записи идентификаторов.

6.В чем заключается различие между константой и переменной?

7.Сохраняет ли переменная свое значение в ходе выполнения всей программы?

8.Как изменить значение константы?

9.Дайте определение термину "инициализация переменной"

10.Перечислите стандартные типы данных языка Си.

11.Перечислите модификаторы типов данных.

12.Какие группы операторов языка Си Вы знаете?

13.Что такое тип данных char?

14.Какой тип данных нужно использовать для записи стоимости товара (в рублях и копейках)?

15.Какова структура программы на языке Си?

16.Какие функции выполняют комментарии в программе?

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

3. Выражения и операции

Любое действие, над данными, выполняемое программой можно рассматривать как некоторое вычисление. На заре развития электронной техники это свойство было отражено в самом названии компьютера, машины первого и второго поколения назывались вычислительными устройствами, а позднее электронными вычислительными машинами (ЭВМ).

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

Операнд это константа, литерал, идентификатор, вызов функции, индексное выражение,

выражение выбора элемента. Комбинацию операндов можно также рассматривать как операнд. В простейшем случае операнд это переменная или константа.

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

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

первичные (вызовы функций, индексные выражения и выбор элементов);

унарные (с одним операндом);

бинарные (с двумя операндами);

тернарные (с тремя операндами);

выражения присваивания;

выражения приведения типа.

Полный список операций языка С приведен в таблице 3.3. в конце главы.

3.1. Операция и выражение присваивания

Операция присваивания обозначается символом "=", её простейший вид: L = r.

Операция присваивания выполняется справа налево, то есть сначала вычисляется значение выражения r, а затем это значение присваивается операнду L, причем левый операнд должен быть адресным выражением, то есть объектом, размещенным в памяти компьютера.

Примером адресного выражения является имя переменной.

Примером не адресного выражения является, например, выражение a+b, а также константы, которые могут стоять только справа. Также отметим, что в языке Си возможна и такая запись:

a = b = c = d = e + 2;

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

Пример: int i; char ch; i=3.14; ch=777;

Здесь i получает значение 3, так как теряется дробная часть числа 3.14, а значение 777 слишком велико, и потому не может быть размещено в char-переменной, заметим, что максимальное число, которое можно записать в один байт (размер char-переменной)это 377.

Существует так называемая комбинированная операция присваивания вида: a оп= b,

здесь оп является знаком одной из бинарных операций: + - * / % >> << & | ^ && ||.

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

Примеры:

a += 2

означает

a = a+2

s /= a

означает

s = s/a

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Результатом операции присваивания является ее левый операнд; следовательно, ее результат адресное выражение и поэтому возможна запись:

(a=b)+=c;

Это эквивалентно следующим двум операторам:

a=b; a=a+c;

3.2. Бинарные арифметические операции

Бинарными арифметическими операциями являются:

+сложение;

-вычитание;

*умножение;

/деление;

%деление по модулю (остаток от деления).

Рассмотрим выражения, в которых используются разнотипные данные, именно в этом случае проявляются особенности вычислений при помощи компьютера. Как известно, данные (как операнды, так и результат), должны быть размещены в памяти компьютера, причем объем занимаемой памяти зависит от типа данных. Если при вычислении тип операндов отличается от типа результата, то это следует учитывать при распределении памяти (объявлении переменных).

Пример: Результат выражения i*f преобразуется к типу double (к большему из двух типов), затем результат присваивается переменной g .

int i=5;

double g, f=0.2; g=f*i;

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

int k=10,m=3,x;

 

x=k/m;

// x=3

 

int l=10;

 

double p=3,z;

 

z=l/p;

// z=3.33333…

Пример: Операция a % b применяется только к целым операндам и дает остаток от деления a на b.

10 % 3

дает 1,

2 % 3

дает 2,

12 % 2

дает 0.

3.3. Операции увеличения (++) и уменьшения (--)

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

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

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

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

Пример:

int i=0, j=0, k, l; k = ++i;

l= j ++; - - k; + + j;

//k=1 , i = 1

//l=0 , j = 1;

//k=0;

//j = 2

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Иначе говоря, результат выполнения k = ++i; тот же, что и в последовательности операторов i = i+1; k

=i; ,а результат k = j++; такой же, как и в последовательности k = j; j = j+1;

Вследующем примере вначале вычисляется t*5, а затем t++. Аналогично, вначале вычисляется s++, а затем s / 3.

Пример:

 

int t=1, s=2, z, f;

 

z=(t++)*5;

// z=5, t=2.

f=(++s) / 3;

// s=3, f=1

Если операции увеличения и уменьшения используются как самостоятельные операторы, префиксная и постфиксная формы записи становятся эквивалентными:

z++; // эквивалентно ++z

3.4. Преобразования типов при вычислении арифметических выражений

3.4.1. Неявное преобразование типов

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

Неявные преобразования типов данных происходит в следующих случаях:

1.При выполнении арифметических вычислений.

2.При выполнении операции присваивания, если значение левой и правой части выражения различается по типу.

3.При передаче аргументов функции.

В независимости от причины, вызвавшей неявное преобразование, все они подчиняются общим правилам, которые состоят в следующем:

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

Размеры для различных типов данных (в битах) приведены ниже:

long double

80

double

64

float

32

unsigned long

32

long

32

unsigned

32

int

32

short

16

char

8

Согласно этому правилу float преобразуется в double, long в unsigned long, и так далее.

2.Операнд типа char всегда преобразуется к типу int по следующим правилам:

unsigned char преобразуется в int, у которого знаковый разряд всегда нулевой;

signed char преобразуется в int, у которого знаковый разряд совпадает со знаком из char.

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

Пример: double ft,sd;

unsigned char ch; unsigned long in; int i;

....

sd = ft*(i+ch/in);

В этом выражении преобразования типов данных будут выполняться в следующей последовательности:

Операнд ch преобразуется к типу unsigned int (правило для типа char).

Затем он преобразуется к типу unsigned long ( к большему операнду выражения ch/in), по этой же причине i преобразуется к unsigned long.

Результат операции, заключенной в круглые скобки будет иметь тип unsigned long.

Затем он преобразуется к типу double (к большему операнду выражения ft*(i+ch/in)).

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]