Мегаобучалка Главная | О нас | Обратная связь


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



2019-11-20 156 Обсуждений (0)
Операции преобразования типов 0.00 из 5.00 0 оценок




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

1. int a, b;

2. float c;

3. a = 7; b = 14;

4. c = a/b; /* результат 0 */

Для получения правильного результата можно поступить так

1. c = a; c = c/b;

А можно применить операцию преобразования типа:

1. БНФ:

2. преобразование_типа = "("имя_типа ")" выражение

имя_типа - название любого типа, в том числе и заданного программистом.

Для нашего примера применение операции преобразования типа будет выглядеть так:

1. c = (float)a / (float)b;

Операция преобразования типа имеет приоритет более высокий, чем арифметическая операция.

 

 

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

 

примеры обозначения операций, принятые в языке С:

· (..) - открывающая и закрывающая скобки. Показывают старшинство выполнения действий в скобках.

· . обыкновенная десятичная точка. Отделяет целую часть от дробной части числа.

· ++ увеличение на единицу (increment).

· -- уменьшение на единицу (decrement).

· + сложение.

· - вычитание.

· * умножение.

· / деление.

· > больше.

· < меньше.

· = равно.

· == не равно.

· && логическое умножение или конъюнкция.

· || логическое сложение или дизъюнкция.

· # знак операции препроцессора.

· и так далее...

В языке С к арифметическим операциям относятся следующие операции:

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

· + сложение;

· * умножение;

· / деление;

· % деление по модулю;

· ++ увеличение на единицу;

· -- уменьшение на единицу;

Операции сложения, вычитания, умножения и деления действуют так же, как в большинстве алгоритмических языков программирования. операции выполняются так: сначала вычисляется значение левого выражения (операнда), затем вычисляется значение выражения, стоящего справа от знака действия. Далее, в том случае, когда операнды имеют общий тип данных, этот же тип имеет и результат. Поэтому, если применяется деление "/" к целым числам, например, 11/3, то результат тоже будет целым, то есть в данном случае 3. А выражение 1/2 в этом случае будет равно нулю.

Операция "%" деление по модулю дает остаток от целочисленного деления. Она может применяться к целочисленным переменным.

 

9) Логические операции.

 

Среди логических операций следует выделить операции 'и' ('and'), 'или' ('or'), отрицание 'не' ('not') и сложение по модулю 2 ('xor'). В языке Си логические операции обозначаются следующим образом:

Операция Обозначение в Си
x and y x && y
x or y x || y
not x !x
x xor y x ^ y

 

Следует отметить также логическую операцию сравнения, обозначаемую в Си двумя знаками равенства. При этом выражение (x == y) эквивалентно !(x xor y). Операция называется операцией "сложение по модулю 2", потому что x xor y = (x + y) mod 2. Логические операции подчиняются правилу Де-Моргана:

not (x and y) = (not x) or (not y)

или то же самое

!(x && y) = !x || !y

10) Операция присваивания.

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

Результат операции присваивания - значение присвоенной величины.

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

1. Например:

2.

3. ab = ( c = d+5 ) * 6

Присваивание имеет самый низкий приоритет из всех операций.

11) Операции сравнения.

== равно!= не равно< меньше> больше<= меньше или равно>= больше или равно

Операции сравнения. Сравнивать можно операнды любого типа, но либо они должны быть оба одного и того же встроенного типа ( сравнение на равенство и неравенство работает для двух величин любого типа), либо между ними должна быть определена соответствующая операция сравнения. Результат – логическое значение true или false.

12) Преобразование типов. Правило преобразования типов.

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

Среди преобразования типов в языке Си выделяют:

1. преобразование операндов в арифметических выражениях;

2. преобразование указателей;

3. преобразование ссылок.

 

Пример:

Неявное приведение типов Явное приведение типов I способ Явное приведение типов II способ  
int x = 5; float y; y = 1/x;   Ответ: y = 0.000000; int x = 5; float y; y = 1.0/x;   Ответ: y = 0.200000; int x = 5; float y; y = (float) 1/ (float) x;   Ответ: y = 0.200000;

 

Так как первой операцией, которая буте выполнена, является деление, а операнды трактуются компилятором как целые, то результат деления будет приведен в целый вид. Таким образом, значение переменной их после присваивания будет равно 0.000000. В данном случае, мы имеем неявное приведение типов, которое выполнится компилятором. Для устранения потери вещественной части числа требуется явно произвести приведение типов или константы, или переменной.

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

1. каноническая операция приведения типов: (float) 2/5, (int) 7.12; может применяться и для типов, имеющих сложные обозначения: (int) x/(2+x);

2. функциональная операция приведения типов (не может применяться для для типов, не имеющих простого имени): int (3.1415), float (2/5);

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

Рисунок 7. Арифметические преобразования типов

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

 

 

13) Условный оператор

Основные операторы языка Си можно условно разделить на 3 группы:

1. операторы выбора;

2. операторы циклов;

3. операторы переходов.

Условный оператор if, относящий к операторам выбора, имеет 3 формы. Первая форма – сокращенная:

if(выражение_условие)

операторы_дествия;

Рисунок 8. Блок схема сокращенной формы условного оператора

где в качестве выражения_условия могут использоваться арифметические выражения, отношения и логические выражения. Действие выполняется только в случае истинности (т.е. при ненулевом значении) выражения_условия.

Пример:

if(x < 0)

y = -x;

Кроме сокращенной формы, существует полная форма условного оператора if:

if(выражение_условие)

операторы_действия_1;

else

операторы_действия_2;

Рисунок 9. Блок схема полной формы условного оператора

 

Здесь в случае истинности выражения_условия выполняется только действие_1 или блок действий_1, при нулевом значении выражения_условия выполняется только действие_2.

Пример:

if(x > 0)

y = x;

else

y = -x;

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

if(выражение_условие_1)

операторы_действия_1;

else if(выражение_условие_2)

операторы_действия_2;

else

операторы_действия;

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

 

Пример:

if(x > 0)

y = x;

else if(x < 0)

y = -x;

else

y = 0;

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

if (x > 0)

z = y / x;

if (y < 0)

z = x + y;

else

z = x - y;

 

В такой форме непонятно, к какому из операторов if относится else. В языке Си оператор else ассоциируется с ближайшим if в соответствующем блоке. В последнем примере else относится к if (y<0).

Таблица 8

Примеры с использованием условного оператора

 

 

Пример 1 [программа pr_4] Пример 2 [программа pr_5]
#include <stdio.h> #include <conio.h> #include <math.h>   int main(void) { float x, y, z; clrscr(); printf("\nx = "); scanf("%f", &x); printf("\ny = "); scanf("%f", &y); if(x!=2 && (x+y)/(2-x)>=0 && (x-y)>0) { z = sqrt((x+y)/(2-x))*sin(y) - log(x-y); printf("\nz = %.2f", z); } else printf("Error!"); getch(); return 0; } #include <stdio.h> #include <conio.h>   int main(void) { int x, y; clrscr(); printf("\nx = "); scanf("%d", &x); if(x) y = 1; else y = 0; printf("y = %d", y); if(!x) y = 1; else y = 0; printf("\ny = %d", y); getch(); return 0; }

14) Условная операция

В некоторых случаях вместо оператора if удобно использовать условную операцию ?:, которая позволяет сократить запись программ и число используемых переменных.

1. БНФ:

2. условное_операция = выр_0 "?" выр_1 ":" выр_2

Значение условной операции равно <выр_1>, если <выр_0> не равно 0 и <выр_2> в противном случае. Например, следующий оператор

1. if ( x>a ) f = sin( x-a ); else f = sin(x);

можно заменить условной операцией, и сразу вычислить f:

1. f = sin( x>a ? x-a : x );

Очевидно, в последнем случае получился более короткий код, поскольку обращений к переменной f и функции sin вдвое меньше.

15) Оператор множественного выбора ( switch )

Основным средством для организации мультиветвления служит оператор- переключатель switch. Основная форма оператора:

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

{

case константа_1:

действия_1;

break;

case константа_2:

действия_2;

break;

case константа_ N:

действия_ N;

break;

default:

действия;

}

Сначала вычисляется выражение в скобках за ключевым словом switch. Затем просматривается список меток (case константа_1 и так далее) до тех пор, пока не находится метка, соответствующая значению вычисленного выражения. Далее происходит выполнение соответствующей последовательности действий, следующих за двоеточием. Если же значение выражения не соответствует ни одной из меток оператора switch, то выполняется последовательность действий, следующая за ключевым словом default. Допускается конструкция switch, когда слово default и соответствующая последовательность конструкция операторов может отсутствовать.

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

 

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

#include <stdio.h> #include <conio.h>   int main(void) { int x; float y; clrscr(); printf("x = "); scanf("%d", &x); switch(x) { case 4: y = 1.0/(x-2); break; case 8: y = x*2.0; break; default: y = x/2.0; } printf("\ny = %.2f\n", y); getch(); return 0; }    

16) Оператор цикла for

Основная форма цикла for имеет следующий вид:

for(выражение_1; выражение_2; выражение_3)

операторы_действия;

или

for(инициализация; проверка условия; шаг цикла)

операторы_действия;

 

В простейшем форме инициализация или выражение_1 используется для присвоения начального значения параметру цикла. Проверка условия или выражение_2 – обычно условное или арифметическое выражение, которое определяет, когда цикл должен быть завершен. Изменение-шаг или выражение_3 обычно используется для изменения параметра цикла каждый раз при повторении цикла. Эти три раздела заголовка цикла должны быть разделены точкой с запятой. Выполнение цикла происходит до тех пор, пока условное выражение истинно. Как только условие становится ложным, начинает выполняться следующий за циклом for оператор. Любое из трех выражений в операторе for могут отсутствовать, но разделяющие их символы «; - точка с запятой» должны присутствовать всегда. Если отсутствует выражение_2, то считается, что оно истинно и нужны специальные средства для выхода из цикла.

Пример программа :

Вариант 1

printf(“x\ty\n”);

for(x=0; x<11; x++)

{

y = x*x;

printf(“%d\t%d\n”, x, y);

}

Вариант 2

printf(“x\ty\n”);

for(x=0; x<11; x++)

printf(“%d\t%d\n”, x, x*x);

Вариант 3

printf(“x\ty\n”);

for(x=0; x<11; printf(“%d\t%d\n”, x, x*x), x++);

 

17) Оператор цикла while

Основная форма имеет следующий вид:

while(выражение_условие)

операторы_действия;

 

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

Так же как и в цикле for в цикле while сначала проверяется условие, а затем выполняется действие. Таким образом, для заведомо ложного выражения_условия тело цикла не выполнится ни разу. Это называется цикл с предусловием.

 

 

18) Понятие указателя. Объявление, инициализация, операции.

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

тип *имя_указателя;

Переменная в программе – это объект, имеющий имя и значение. По имени можно обратиться к переменной и получить ее значение.

Чтобы получить адрес переменной в явном виде, в языке Си применяют унарную операцию &. Выражение &X позволяет получить адрес участка памяти, выделенного на машинном уровне для переменной Х.

Операция & применима только к объектам, имеющим имя и размещение в памяти. Ее нельзя применять к выражениям, константам, регистровым переменным или внешним объектам.

Целые переменные занимаю по 2 байта, вещественные с плавающей точкой – 4 байта, символьные – 1 байт.

Адреса имеют целочисленные беззнаковый значения и их можно обрабатывать как целые величины.

В определениях и описаниях указателей применяется разделитель *, который является в этом случае знаком унарной операции косвенной адресации. Иначе называемой операцией разыменования или обращения по адресу. Операндом операции разыменования всегда является указатель. Результат этой операции – тот объект, который адресует указатель операнд.



2019-11-20 156 Обсуждений (0)
Операции преобразования типов 0.00 из 5.00 0 оценок









Обсуждение в статье: Операции преобразования типов

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (156)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)