Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Операции С, их приоритеты и использование. Преобразование типов





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

Теоретические сведения

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

Таблица 19 - допустимые операции над переменными

АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
Операция Пояснение Пример
* Умножение A=b*c;
/ Деление (для целых – нацело) a=b/c;
% Остаток от деления (для целых) a=b%c;
<операция x> = + =; - =; * =; / =; % = составное присваивание Изменить и заменить a+=3; или a=a+3; a%=c; или a=a%c;
++ Инкремент(увеличить на 1) с++; или с=с+1; + + а
-- Декремент(уменьшить на 1) с--; или с=с-1; - - а
+ Бинарный плюс (сложение) A=b+c;
- Бинарный минус (вычитание) A=b-c;
ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Операция Пояснение Пример
&& "И" a&&b
|| "ИЛИ" a||b
! "НЕ" !a
== "РАВНО" a= =b
!= "НЕ РАВНО" a!=b
> "БОЛЬШЕ" a>b
>= "БОЛЬШЕ ИЛИ РАВНО" a>=b
< "МЕНЬШЕ" a<b
<= "МЕНЬШЕ ИЛИ РАВНО" a<=b
ПОБИТОВЫЕ ОПЕРАЦИИ (ПОРАЗРЯДНЫЕ)
Операция Пояснение Пример
& “И” (and) 1&1=1; 1&0=0;0&0=0;
| “ИЛИ” (or) 1 | 1=1; 1 | 0 =1; 0 | 0=0;
^ “ИСКЛЮЧАЮЩЕЕ ИЛИ” (xor) 1^1 = 0; 1 ^ 0=1; 0^0=0;
~ “ОТРИЦАНИЕ” (not) ~1=0; ~0=;
<< “СДВИГ ВЛЕВО” (shl) 0001b<<2=0100b; (буква b означает что число двоичное)
>> “СДВИГ ВПРАВО” (shr) 0010b >> 1=0001b;
<операция >= составное присваивание. Изменить и заменить, где <операция > может быть: &,|,^,>>,<<. а&=b или a = &b a^=bилиa = a^b a<<=bили a<<b

 

 

Приоритет операций и порядок выполнения (ассоциативность)

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

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

Таблица 20 - Приоритет операций

Приоритет Знак операции Тип операции Ассоциативность (порядок выполнения)
  () [ ].–> Первичные → слева направо
  – ~! * & ++ -- sizeof, приведение типов () Унарные ← справа налево
  * / % Мультипликативные
  + - Аддитивные
  << >> Сдвиги
  < > <= > = Отношение
  = =! = Отношение
  & Поразрядное "и"
  ^ Поразрядное исключающее "или"
  | Поразрядное включающее "или"
  && Логическое "и"
  | | Логическое "или"
  ?: Условная (тернарная)
  = * = / = % = Простое и составное присваивание
+ = – = << = >> =
& = | = ^ =  
  , Последовательное вычисление

 

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

Примеры. а = b&ÆхFF + 5; // вычисляется как а = b&(Æх FF + 5);

b=а + с >> 1; // как b=(а +с) >> 1;

с = а + + + b/5; // как с=(а + +) + (b/5);

Мультипликативные, аддитивные и поразрядные операции обладают свойством коммутативности. Компилятор вычисляет выражения с учётом приоритета в любом порядке, даже если есть скобки. Определённый порядок вычисления (,) операндов гарантируют операции: последовательного вычисления, логические «И» (&&) и «ИЛИ» (||), условная операция (?:).

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

func (i + 1, i = j + 2); //. Не гарантирует порядок вычисления фактических

// аргументов

i= 0;// i имеет тип int по умолчанию

a [++ i] = i; // порядок вычисления левого и правого операндов не
// гарантируются a [0] = 0 или a[1]=1

(x - 5) && ++ i // Если x =5, то ++ i не вычисляется

int x, y, z, f();

z = x > y || f(x, y); // Если x > y,то значение z = 1 «Истина», а f() –не

// вызывается

// если x £ y, то f() вызывается, тогда z=0,

// eсли f() возвращает нулевое значение, или z = 1,

// если f() возвращает не нулевое значение

// printf (“%d %d \n“, ++n, p()2, n)

// в функцию может передаваться n или n+1.

 

Преобразование типов

В выражениях С переменные различных типов в ряде случаев могут использоваться совместно; например, переменные типа char могут присутствовать в выражениях одновременно с переменными типа int.

Пример совместного использования целых и символьных переменных.

char ch='a', ans; // объявление переменных ch и ans

printf("значение ch + 3 = %d", ch+3); // вывод значения ch+3

ans = ch % 3;// определение остатка от целочисленного деления

printf("\n\n значение ans = % d\n", ans);

Поскольку char это целый тип, для него применимы все операции, операнды которых могут иметь тип int. Целые по умолчанию - это величины со знаком signed.

С переменными вещественного типа (float, double и др.) применимы все операции, допустимые для целого типа int,за исключением операции остатка от деления (%).

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

(<новый_тип>) <операнд>;

или

<новый_тип> (<операнд>).

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

Рассмотрим результаты таких преобразований.

Данные типа char или short int могут использоваться везде, где используется тип int. Во всех случаях значение преобразуется к целому типу

Арифметические операции над числами с плавающей точкой (float и double) по умолчанию выполняются с двойной точностью.

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

Если целое без знака (unsigned) используется вместе с простым целым, то простое целое и результат преобразуются в целое без знака.

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

Сначала любые операнды типов char, unsigned char или short преобразуются в int, а любые операнды типа float преобразуются в double.

Затем, если какой-либо операнд имеет тип double, то другой преобразуется к типу double и типом результата будет double.

В случае, если какой-либо операнд имеет тип unsigned long, то другой преобразуется к типу unsigned long и это же будет и типом результата.

В случае, если какой-либо операнд имеет тип long, то другой преобразуется к типу long и это же будет типом результата.

В случае, если операнд имеет тип unsigned, то другой операнд преобразуется к типу unsigned, и это будет типом результата.

Объект типа void* ( указатель на пустой ) может быть объявлен для указания на объекты неизвестного типа.

Преобразование типа такого указателя задаётся с помощью явной операции преобразования типов.

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

Указатель на один тип может быть преобразован в указатель на другой тип. При этом возможно преобразование указателя в указатель на объект меньшего размера и обратно без изменений.

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

extern void* allos ();

doube* dp;

dp = (doube*) allos (sizeof (doube));

*dp = 2,6/8,4







Дата добавления: 2015-09-15; просмотров: 481. Нарушение авторских прав; Мы поможем в написании вашей работы!




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


Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...


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


Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

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

Искусство подбора персонала. Как оценить человека за час Искусство подбора персонала. Как оценить человека за час...

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

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

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

Образование соседних чисел Фрагмент: Программная задача: показать образование числа 4 и числа 3 друг из друга...

Studopedia.info - Студопедия - 2014-2025 год . (0.01 сек.) русская версия | украинская версия