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

Часть 1: основные операторы и их приоритеты.

Лекция 1: введение в программирование. | Лекция 2: представление данных в компьютере. | Часть 1: хранение данных в компьютере. | Лекция 5: Функция main, функции ввода-вывода, препроцессор. | Лекция 6: массивы и строки, библиотечные функции ввода-вывода. | Лекция 7: операторы выбора, безусловный переход, циклы. | Лекция 8: структуры и объединения. | Лекция 9: связные списки. | Часть 2: бинарные деревья. | Часть 3: динамическое программирование. |


Читайте также:
  1. A) именная часть составного сказуемого
  2. Cities-65: Радомышль. Часть 1. Вокзал и задворки центра
  3. Hearthlab часть 5: Исступление
  4. I ОСНОВНЫЕ ПРИНЦИПЫ
  5. I ЧАСТЬ ВТОРАЯ
  6. I. Основные положения
  7. II. Основные задачи и их реализация

Минимальной единицей программного кода является оператор. Будучи одним из базовых понятий программирования, оператор не может быть определён строго. Интуитивное понимание оператора таково – это некие элементарные действия, из которых строятся более сложные. Операторы бывают одиночные и блочные. Одиночный оператор языка Си всегда заканчивается знаком;. Блочный оператор – это последовательность операторов, которая рассматривается как один. Блочный оператор заключается в фигурные скобки: {<операторы>}. Вот список наиболее употребляемых операторов языка Си:

Оператор Значение Пример
<переменная1>=<переменная2> Присваивание. В переменную1 записывается значение перменной2. Переменная1 при этом не изменяется. Работает со всеми типами данных. a=b;
!<переменная> Логическое НЕ. Если переменная была равна 0, то!<переменная> имеет ненулевое значение (обычно 1). Иначе – ноль. Корректно работает с целочисленными данными. a=!b;
~<переменная> Побитовое НЕ, дополнение до 1. Каждый бит переменной изменяется на противоположный. Логически это означает, что получается число, равное <максимальное значение данного типа>-<переменная>. Корректно работает с целочисленными данными. a=~b:
<переменная1>&&<переменная2> Логическое И. Если обе переменные не равны 0, то имеет значение 1, в противном случае 0. Корректно работает с целочисленными данными. a=b&&c;
<переменная1>&<переменная2> Побитовое И. Применяет логическую функцию И ко всем парам соответствующих бит. Корректно работает с целочисленными данными. a=b&c;
<переменная1>||<переменная2> Логическое ИЛИ. Если хотя бы одна переменная не равно 0, то имеет значение 1, в противном случае 0. Корректно работает с целочисленными данными. a=b||c;

 

<переменная1>|<переменная2> Побитовое ИЛИ. Применяет логическую функцию ИЛИ ко всем парам соответствующих бит. Корректно работает с целочисленными данными. a=b|c;  
<переменная1>^<переменная2> Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ– Применяет логическую функцию ИСКЛЮЧАЮЩЕЕ ИЛИ ко всем соответствующим парам бит. Корректно работает с целочисленными данными. a=b^c;
<переменная1><<<переменная2> Арифметический[7] сдвиг вправо. Все биты числа сдвигаются вправо на количество позиций, равное переменной2. Правые биты заполняются нулями, если исходное число положительное, единицами – если отрицательное. Эта операция эквивалентна умножению на 2<переменнная2>[8]. Корректно работает с целочисленными данными. a=a<<b;
<переменная1>>><переменная2> Арифметический сдвиг влево. Все биты числа сдвигаются влево на количество позиций, равное переменной2. Левые биты заполняются нулями. Эта операция эквивалентна взятию целой части от деления на 2<переменнная2>. Корректно работает с целочисленными данными. a=b>>c;
<переменная>++[9] Инкремент – прибавление 1 к переменной. Корректно работает с целочисленными данными. a++;
<переменная>-- Декремент– вычитание 1 из переменной. Корректно работает с целочисленными данными. b--;
<переменная1>+<переменная2> Сложение– сумма переменной1 и переменной2. Работает со всеми типами данных. c=a+b;
<переменная1>-<переменная2> Вычитание– разность перменной1 и переменной2. Работает со всеми типами данных. a=c-b;

 

-<переменная> Унарный минус– меняет знак переменной на противоположный Работает со всеми типами данных a=-b;
<переменная1>*<переменная2> Умножение– результат перемножения перменной1 и переменной2. Работает со всеми типами данных. a=b*c;
<переменная1>%<переменная2> Остаток- взятие остатка от деления переменной1 на перменную2. Корректно работает с целочисленными данными. a=b%c;
<переменная1>/<переменная2> Деление– деление переменной1 на переменную2. Многие компиляторы определяют эту операцию для всех типов данных, но по стандарту она работает для чисел с плавающей точкой. e=f/g;
&<переменная> Взятие адреса– &<переменная> имеет значение адреса, по которому расположена переменная. Работает со всеми типами данных. p=&a;
*<указатель> Разадресация - *<указатель> имеет значение переменной, на которую ссылается указатель. Количество считываемых байт и их интерпретация зависят от типа указателя. Работает с указателями на любые типы. a=*p;
<переменная1>==<переменная2> Равно– операция сравнения. Если переменная1 равна переменной2, то имеет значение 1, в противном случае 0. Работает с любыми типами данных. a=b==c;
<переменная1>!=<переменная2> Не равно– операция сравнения. Если переменная1 равна переменной2, то имеет значение 0, в противном случае 1. Работает со всеми типами данных. a=b!=c;
<переменная1>><перменная2> Больше – операция сравнения. Имеет значение 1, если переменная1 больше переменной2, в противном случае 0. Работает со всеми типами данных. a=b>c;
<переменная1>>=<перменная2> Больше или равно – операция сравнения. Имеет значение 1, если переменная1 больше или равна переменной2, в противном случае 0. Работает со всеми типами данных. a=b>=c;
<переменная1><<перменная2> Меньше – операция сравнения. Имеет значение 1, если переменная1 меньше переменной2, в противном случае 0. Работает со всеми типами данных. a=b<c;
           

 

<переменная1><=<перменная2> Меньше или равно – операция сравнения. Имеет значение 1, если переменная1 меньше или равна переменной2, в противном случае 0. Работает со всеми типами данных. a=b<=c;  
<переменная1><бинарный оператор>=<переменная2> Составное присваивание. Эквивалентно <переменная1>=<переменная1> <бинарный оператор><переменная2> a+=3; то же, что и a=a+3;
<тип> <имя переменной>[=<значение>] [,<имя переменной2>[=<значение>]…] Объявление переменной. Выделяет в памяти место под переменные, и связывает адреса с их именами. int a=3, b;[10]
(<тип>)<переменная> Преобразование типа – преобразует переменную к указанному типу. В конкретных случаях может означать, например, округление, изменение размера и так далее… a=(float)b;

Чаще всего приходится иметь дело с несколькими идущими подряд операторами. Даже такая вещь как a=b<c; – это два оператора: сравнение и присваивание. Интуитивно понятно, что мы хотим получить в a результат сравнения b и c, но не всегда вещи, понятные интуитивно, понятны компилятору (часто бывает, что и наоборот).

Для таких ситуаций существуют, во-первых, скобки. Круглые скобки в Си имеют тот же смысл, что и в математике: операторы, заключённые в большее количество скобок, выполняются раньше. Так становится очевидным смысл строки a=(((*b)+c)<d); – в переменную a кладётся результат сравнения суммы переменной, находящейся по адресу b, и переменной c с переменной d. Понятно, однако, что такая форма записи является неудобной и контринтуитивной. Поэтому существует такое понятие как приоритет операций.

Приоритет операций определяет порядок выполнения последовательно записанных операторов. Чем меньше приоритет операции, тем раньше она выполняется. Операции с одинаковым приоритетом выполняются слева направо. Скобки позволяют менять этот порядок. Ниже приведена краткая таблица приоритетов операций в Си:

Операции Приоритет
Префиксный инкремент и декремент  
Унарный минус, преобразование типа, взятие адреса, разадресация, логическое НЕ, побитовое НЕ  
Умножение, /, %  
+, -  
<<, >>  
<, <=, >, >=  
==,!=  
Побитовое И  
Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ  
Побитовое ИЛИ  
Логическое И  
Логическое ИЛИ  
Присваивание, составное присваивание 14[11]
Постфиксный инкремент и декремент  

Следует также отменить, что логические операторы выполняются ровно до того момента, как значение выражение не будет определено однозначно. Например, если в выражении a&b a имеет значение 0, то смотреть значение b не имеет смысла – выражение в любом случае равно 0. Это свойство позволяет создавать такие конструкции:

(b<10)&&(a=2)||(b>=10)&&(a=1);

Рассмотрим работу этой строки. Допустим, значение b меньше десяти. Тогда левая часть выражения (b<10)&&(a=2) будет равна 1, и чтобы определить его значение нужно узнать значение выражения a=2. Переменная a примет значение 2, а выражение a=2 – значение 2, поскольку присваивание имеет то же значение, которое было присвоено. Таким образом, левая часть выражения (b<10)&&(a=2)||(b>=10)&&(a=1),будет иметь значение 1. Это автоматически означает, что значение всего выражения равно 1, и считать дальше нет смысла. Поэтому второе присваивание выполнено не будет, значение a останется равным 2.

Если же b не меньше десяти, то выражение b<10 будет неверным, и дальнейшее вычисление выражения (b<10)&&(a=2) не имеет смысла. Но при этом левая часть выражения (b<10)&&(a=2)||(b>=10)&&(a=1) будет равно 0, а потому для определения его значения нужно посчитать значение (b>=10)&&(a=2). Левая часть этого выражения равна 1, и для определения значения нужно посчитать значение правой. Переменной a будет присвоено значение 1.


Дата добавления: 2015-11-13; просмотров: 42 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Часть 2: типы данных языка Си.| Часть 2: функции.

mybiblioteka.su - 2015-2024 год. (0.015 сек.)