Что называется унарной а что бинарной операцией
BestProg
Содержание
Поиск на других ресурсах:
1. Таблица приоритетности операций (операторов) языка C#
Ниже приведена таблица приоритетности операций (операторов) в языке программирования C#. Операции и операторы следуют в порядке убывания приоритетности.
Исходя из таблицы, первыми обрабатываются операции или операторы, которые имеют наивысший приоритет.
Например, в выражении
x = a + b * (c — 5);
операции выполняются в последовательности, как показано на рисунке
Рисунок 1. Приоритет операций в соответствии с таблицей приоритетности
Объяснение к рисунку 1. Операции выполняются в следующей последовательности:
Любая операция или оператор для проведения вычислений требуют наличия некоторого количества операндов. По количеству операндов операторы делятся на следующие группы:
Существуют операторы, которые по своему обозначению встречаются в более чем одной группе. Например, операция минус ( – ) может быть унарной (обозначение отрицательных чисел) и бинарной (операция вычитания чисел).
3. Что означает понятие префиксной и постфиксной формы?
Некоторые операторы в языке C# могут иметь префиксную и постфиксную форму. К таким операторам принадлежат операторы инкремента ( ++ ) и декремента ( — — ).
Операторы инкремента ( ++ ) увеличивают на 1 значение целочисленной величины. Соответственно операторы декремента уменьшают на 1 значение целочисленной величины.
В префиксной форме операторов инкремента и декремента оператор ++ или — — размещается перед переменной, которая обрабатывается. В постфиксной форме операторов инкремента и декремента соответствующий оператор размещается после обрабатываемой переменной.
Унарные, бинарные и тернарное выражения
Лекция №2
Операции и Выражения
Знаки операций определяют действия, которые должны быть выполнены над операндами.
Комбинация знаков операций и операндов, результатом которой является определенное значение, называется выражением. Каждый операнд в выражении может быть выражением. Значение выражения зависит от расположения знаков операций и круглых скобок в выражении, а также от приоритета выполнения операций.
Lvalues и Rvalues выражения
Lvalues –выражение (или именующее выражение) представляет собой локатор объекта, выражение, которое обозначает объект.
Модифицируемое именующее выражение – это идентифицирующее выражение, относящееся к объекту, к которому возможен доступ и допустимо его изменение в памяти. Так значения констант, описанные в модификаторе const, не являются модифицируемыми именующими выражениями. Исторически в слове Lvalues буква L означает «левый» (Left). Это означает, что Lvalue допускается в левой части оператора присваивания. Здесь в левой части оператора присваивания допустимы только модифицируемые именующие выражения. Например, если а и с – это не являющиеся константами целочисленные идентификаторы с правильно распределенными для них областями памяти, то оба они являются модифицируемыми именующими выражениями, и присваивания типа а=1; с=а+с; вполне допустимы.
Rvalues –выражения называют значением переменной (значением правой части выражения). Исторически в слове Rvalues буква R означает «правый» (Right).Так, например, выражение с+а не является именущим (присваивание типа с+а=с недопустимо), но является Rvalue –выражением.
Унарные, бинарные и тернарное выражения
Унарное выражение состоит из операнда и предшествующего ему знаку унарной операции и имеет следующий формат:
Бинарное выражения состоит из двух операндов, разделенных знаком бинарной операции:
Тернарное выражение состоит из трех операндов, разделенных знаками тернарной операции (?) и (:), и имеет формат:
По количеству операндов, участвующих в операции, операции подразделяются на унарные, бинарные и тернарные.
Унарные операции выполняются справа налево.
Операции увеличения и уменьшения увеличивают или уменьшают значение операнда на единицу и могут быть записаны как справа так и слева от операнда. Если знак операции записан перед операндом (префиксная форма), то изменение операнда происходит до его использования в выражении. Если знак операции записан после операнда (постфиксная форма), то операнд вначале используется в выражении, а затем происходит его изменение.
Таблица 7 Унарные операции
Знак операции | Операция | Группа операций |
+ | Унарный плюс | Аддитивные |
— | Отрицание | |
++ | Увеличение | |
— | Уменьшение | |
Поразрядное отрицание(дополнение) | Поразрядные операции | |
! | Логическое отрицание | Логические операции |
* | Разадресация (косвенная адресация) | Адресные операции |
& | Вычисление адреса | |
Sizeof | Размер | Size-операция |
В отличие от унарных, бинарные операции, список которых приведен в табл.8, выполняются слева направо.
Таблица 8 Бинарные операции
Знак операции | Операция | Группа операций |
* | Умножение | Мультипликативные |
/ | Деление | |
% | Остаток от деления | |
+ | Сложение | Аддитивные |
— | Вычитание | |
> | Сдвиг вправо | |
= | Больше или равно | |
== | Равно | |
!= | Не равно | |
& | Поразрядное И | Поразрядные операции |
| | Поразрядное ИЛИ | |
^ | Поразрядное исключающее ИЛИ | |
&& | Логическое И | Логические операции |
|| | Логическое ИЛИ | |
, | Последовательное вычисление | Последовательного вычисления |
= | Присваивание | Операции присваивания |
*= | Умножение с присваиванием | |
/= | Деление с присваиванием | |
%= | Остаток от деления с присваиванием | |
-= | Вычитание с присваиванием | |
+= | Сложение с присваиванием | |
>= | Сдвиг вправо присваиванием | |
&= | Поразрядное И с присваиванием | |
|= | Поразрядное ИЛИ с присваиванием | |
^= | Поразрядное исключающее ИЛИ с присваиванием |
При вычислении выражений тип каждого операнда может быть преобразован к другому типу. Преобразования типов могут быть неявными, при выполнении операций и вызовов функций, или явными, при выполнении операций приведения типов.
Что называется унарной а что бинарной операцией
Комбинация знаков операций и операндов, результатом которой является определенное значение, называется выражением. Знаки операций определяют действия, которые должны быть выполнены над операндами. Каждый операнд в выражении может быть выражением. Значение выражения зависит от расположения знаков операций и круглых скобок в выражении, а также от приоритета выполнения операций.
В языке СИ присваивание также является выражением, и значением такого выражения является величина, которая присваивается.
При вычислении выражений тип каждого операнда может быть преобразован к другому типу. Преобразования типов могут быть неявными, при выполнении операций и вызовов функций, или явными, при выполнении операций приведения типов.
Если в качестве операнда используется константа, то ему соответствует значение и тип представляющей его константы. Целая константа может быть типа int, long, unsigned int, unsigned long, в зависимости от ее значения и от формы записи. Символьная константа имеет тип int. Константа с плавающей точкой всегда имеет тип double.
Строковый литерал состоит из последовательности символов, заключенных в кавычки, и представляется в памяти как массив элементов типа char, инициализируемый указанной последовательностью символов. Значением строкового литерала является адрес первого элемента строки и синтаксически строковый литерал является немодифицируемым указателем на тип char. Строковые литералы могут быть использованы в качестве операндов в выражениях, допускающих величины типа указателей. Однако так как строки не являются переменными, их нельзя использовать в левой части операции присваивания.
Следует помнить, что последним символом строки всегда является нулевой символ, который автоматически добавляется при хранении строки в памяти.
Идентификаторы переменных и функций. Каждый идентификатор имеет тип, который устанавливается при его объявлении. Значение идентификатора зависит от типа следующим образом:
— идентификаторы объектов целых и плавающих типов представляют значения соответствующего типа;
— идентификатор объекта типа enum представлен значением одной константы из множества значений констант в перечислении. Значением идентификатора является константное значение. Тип значения есть int, что следует из определения перечисления;
— идентификатор объекта типа struct или union представляет значение, определенное структурой или объединением;
— идентификатор, объявляемый как указатель, представляет указатель на значение, заданное в объявлении типа;
— идентификатор, объявляемый как функция, представляет указатель, значение которого является адресом функции, возвращающей значения определенного типа. Адрес функции не изменяется во время выполнения программы, меняется только возвращаемое значение. Таким образом, идентификаторы функций не могут появляться в левой части операции присваивания.
Вызов функций состоит из выражения, за которым следует необязательный список выражений в круглых скобках:
выражение-1 ([ список выражений ])
Значением выражения-1 должен быть адрес функции (например, идентификатор функции). Значения каждого выражения из списка выражений передается в функцию в качестве фактического аргумента. Операнд, являющийся вызовом функции, имеет тип и значение возвращаемого функцией значения.
Индексное выражение задает элемент массива и имеет вид:
Тип индексного выражения является типом элементов массива, а значение представляет величину, адрес которой вычисляется с помощью значений выражение-1 и выражение-2.
Индексные выражения для ссылки на элементы одномерного массива вычисляются путем сложения целой величины со значениями указателя с последующим применением к результату операции разадресации (*).
Так как одно из выражений, указанных в индексном выражении, является указателем, то при сложении используются правила адресной арифметики, согласно которым целая величина преобразуется к адресному представлению, путем умножения ее на размер типа, адресуемого указателем. Пусть, например, идентификатор arr объявлен как массив элементов типа double.
Таким образом, чтобы получить доступ к i-тому элементу массива arr можно написать аrr[i], что, в силу сказанного выше, эквивалентно i[a]. При этом величина i умножается на размер типа double и представляет собой адрес i-го элемента массива arr от его начала. Затем это значение складывается со значением указателя arr, что в свою очередь дает адрес i-го элемента массива. К полученному адресу применяется операция разадресации, т.е. осуществляется выборка элемента массива arr по сформированному адресу.
Таким образом, результатом индексного выражения arr[i] (или i[arr]) является значение i-го элемента массива.
Для ссылки на элемент многомерного массива индексное выражение должно иметь несколько индексов заключенных к квадратные скобки:
Такое индексное выражение интерпретируется слева направо, т.е. вначале рассматривается первое индексное выражение:
Результат этого выражения есть адресное выражение, с которым складывается выражение-3 и т.д. Операция разадресации осуществляется после вычисления последнего индексного выражения. Отметим, что операция разадресации не применяется, если значение последнего указателя адресует величину типа массива.
Рассмотрим процесс вычисления индексного выражения mass[1][2][2].
1. Вычисляется выражения mass[1]. Ссылка индекс 1 умножается на размер элемента этого массива, элементом же этого массива является двухмерный массив содержащий 5х3 элементов, имеющих тип int. Получаемое значение складывается со значением указателя mass. Результат является указатель на второй двухмерный массив размером (5х3) в трехмерном массиве mass.
2. Второй индекс 2 указывает на размер массива из трех элементов типа int, и складывается с адресом, соответствующим mass [1].
4. Наконец, выполняется разадресация полученного указателя. Результирующим выражением будет элемент типа int.
Если было бы указано mass [1][2], то результатом был бы указатель на массив из трех элементов типа int. Соответственно значением индексного выражения mass [1] является указатель на двухмерный массив.
Выражение выбора элемента применяется, если в качестве операнда надо использовать элемент структуры или объединения. Такое выражение имеет значение и тип выбранного элемента. Рассмотрим две формы выражения выбора элемента:
Обе формы выражения выбора элемента дают одинаковый результат. Действительно, запись, включающая знак операции выбора (->), является сокращенной версией записи с точкой для случая, когда выражению стоящему перед точкой предшествует операция разадресации (*), примененная к указателю, т.е. запись
в случае, если выражение является указателем.
В приведенном примере используется операция выбора (.) для доступа к элементу left структурной переменной elem. Таким образом элементу left структурной переменной elem присваивается адрес самой переменной elem, т.е. переменная elem хранит ссылку на себя саму.
Приведение типов это изменение (преобразование) типа объекта. Для выполнения преобразования необходимо перед объектом записать в скобках нужный тип:
Приведение типов используются для преобразования объектов одного скалярного типа в другой скалярный тип. Однако выражению с приведением типа не может быть присвоено другое значение.
В этом примере целая переменная i с помощью операции приведения типов приводится к плавающему типу, а затем уже участвует в вычислении выражения.
2. Операция «адрес» (&) может быть использована только при некоторых инициализациях.
Выражения со знаками операций могут участвовать в выражениях как операнды. Выражения со знаками операций могут быть унарными (с одним операндом), бинарными (с двумя операндами) и тернарными (с тремя операндами).
Унарное выражение состоит из операнда и предшествующего ему знаку унарной операции и имеет следующий формат:
Бинарное выражения состоит из двух операндов, разделенных знаком бинарной операции:
Тернарное выражение состоит из трех операндов, разделенных знаками тернарной операции (?) и (:), и имеет формат:
Операции. По количеству операндов, участвующих в операции, операции подразделяются на унарные, бинарные и тернарные.
В языке Си имеются следующие унарные операции:
— арифметическое отрицание (отрицание и дополнение);
побитовое логическое отрицание (дополнение);
* разадресация (косвенная адресация);
Унарные операции выполняются справа налево.
Операции увеличения и уменьшения увеличивают или уменьшают значение операнда на единицу и могут быть записаны как справа так и слева от операнда. Если знак операции записан перед операндом (префиксная форма), то изменение операнда происходит до его использования в выражении. Если знак операции записан после операнда (постфиксная форма), то операнд вначале используется в выражении, а затем происходит его изменение.
В отличие от унарных, бинарные операции, список которых приведен в табл.7, выполняются слева направо.
Знак операции | Операция | Группа операций |
---|---|---|
* | Умножение | Мультипликативные |
/ | Деление | |
% | Остаток от деления | |
+ | Сложение | Аддитивные |
— | Вычитание | |
> | Сдвиг вправо | |
= | Больше или равно | |
== | Равно | |
!= | Не равно | |
& | Поразрядное И | Поразрядные операции |
| | Поразрядное ИЛИ | |
^ | Поразрядное исключающее ИЛИ | |
&& | Логическое И | Логические операции |
|| | Логическое ИЛИ | |
, | Последовательное вычисление | Последовательного вычисления |
= | Присваивание | Операции присваивания |
*= | Умножение с присваиванием | |
/= | Деление с присваиванием | |
%= | Остаток от деления с присваиванием | |
-= | Вычитание с присваиванием | |
+= | Сложение с присваиванием | |
>= | Сдвиг вправо присваиванием | |
&= | Поразрядное И с присваиванием | |
|= | Поразрядное ИЛИ с присваиванием | |
^= | Поразрядное исключающее ИЛИ с присваиванием |
Левый операнд операции присваивания должен быть выражением, ссылающимся на область памяти (но не объектом объявленным с ключевым словом const), такие выражения называются леводопустимыми к ним относятся:
— идентификаторы данных целого и плавающего типов, типов указателя, структуры, объединения;
— индексные выражения, исключая выражения имеющие тип массива или функции;
— выражения выбора элемента (->) и (.), если выбранный элемент является леводопустимым;
— выражения унарной операции разадресации (*), за исключением выражений, ссылающихся на массив или функцию;
— выражение приведения типа если результирующий тип не превышает размера первоначального типа.
При записи выражений следует помнить, что символы (*), (&), (!), (+) могут\ обозначать унарную или бинарную операцию.
1.3.2. Преобразования при вычислении выражений
При выполнении операций производится автоматическое преобразование типов, чтобы привести операнды выражений к общему типу или чтобы расширить короткие величины до размера целых величин, используемых в машинных командах. Выполнение преобразования зависит от специфики операций и от типа операнда или операндов.
Рассмотрим общие арифметические преобразования.
1. Операнды типа float преобразуются к типу double.
2. Если один операнд long double, то второй преобразуется к этому же типу.
3. Если один операнд double, то второй также преобразуется к типу double.
4. Любые операнды типа char и short преобразуются к типу int.
5. Любые операнды unsigned char или unsigned short преобразуются к типу unsigned int.
6. Если один операнд типа unsigned long, то второй преобразуется к типу unsigned long.
7. Если один операнд типа long, то второй преобразуется к типу long.
8. Если один операнд типа unsigned int, то второй операнд преобразуется к этому же типу.
Таким образом, можно отметить, что при вычислении выражений операнды преобразуются к типу того операнда, который имеет наибольший размер.
При выполнении оператора присваивания правила преобразования будут использоваться следующим образом. Операнд ch преобразуется к unsigned int (правило 5). Затем он преобразуется к типу unsigned long (правило 6). По этому же правилу i преобразуется к unsigned long и результат операции, заключенной в круглые скобки будет иметь тип unsigned long. Затем он преобразуется к типу double (правило 3) и результат всего выражения будет иметь тип double.
1.3.3. Операции отрицания и дополнения
Операция арифметического отрицания (-) вырабатывает отрицание своего операнда. Операнд должен быть целой или плавающей величиной. При выполнении осуществляются обычные арифметические преобразования.
Операция логического отрицания «НЕ» (!) вырабатывает значение 0, если операнд есть истина (не нуль), и значение 1, если операнд равен нулю (0). Результат имеет тип int. Операнд должен быть целого или плавающего типа или типа указатель.
Переменная t получит значение равное 1, так как переменная z имела значение равное 0 (ложно).
Операция двоичного дополнения (
) вырабатывает двоичное дополнение своего операнда. Операнд должен быть целого типа. Осуществляется обычное арифметическое преобразование, результат имеет тип операнда после преобразования.
Шестнадцатеричное значение символа ‘9’ равно 39. В результате операции
f будет получено шестнадцатеричное значение С6, что соответствует символу ‘ц’.
1.3.4. Операции разадресации и адреса
Эти операции используются для работы с переменными типа указатель.
Операция разадресации (*) осуществляет косвенный доступ к адресуемой величине через указатель. Операнд должен быть указателем. Результатом операции является величина, на которую указывает операнд. Типом результата является тип величины, адресуемой указателем. Результат не определен, если указатель содержит недопустимый адрес.
Рассмотрим типичные ситуации, когда указатель содержит недопустимый адрес:
— указатель является нулевым;
— указатель определяет адрес такого объекта, который не является активным в момент ссылки;
— указатель определяет адрес, который не выровнен до типа объекта, на который он указывает;
— указатель определяет адрес, не используемый выполняющейся программой.
Операция адрес (&) дает адрес своего операнда. Операндом может быть любое именуемое выражение. Имя функции или массива также может быть операндом операции «адрес», хотя в этом случае знак операции является лишним, так как имена массивов и функций являются адресами. Результатом операции адрес является указатель на операнд. Тип, адресуемый указателем, является типом операнда.
Операция адрес не может применятся к элементам структуры, являющимися полями битов, и к объектам с классом памяти register.
1.3.5. Операция sizeof
С помощью операции sizeof можно определить размер памяти которая соответствует идентификатору или типу. Операция sizeof имеет следующий формат:
В качестве выражения может быть использован любой идентификатор, либо имя типа, заключенное в скобки. Отметим, что не может быть использовано имя типа void, а идентификатор не может относится к полю битов или быть именем функции.
Если в качестве выражения указанно имя массива, то результатом является размер всего массива (т.е. произведение числа элементов на длину типа), а не размер указателя, соответствующего идентификатору массива.
Когда sizeof применяются к имени типа структуры или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры.
Переменная а1 получит значение, равное 12, в то же время если сложить длины всех используемых в структуре типов, то получим, что длина структуры str равна 7.
Несоответствие имеет место в виду того, что после размещения в памяти первой переменной h длинной 1 байт, добавляется 1 байт для выравнивания адреса переменной b на границу слова (слово имеет длину 2 байта для машин серии IBM PC AT /286/287), далее осуществляется выравнивание адреса переменной f на границу двойного слова (4 байта), таким образом в результате операций выравнивания для размещения структуры в оперативной памяти требуется на 5 байт больше.
В связи с этим целесообразно рекомендовать при объявлении структур и объединения располагать их элементы в порядке убывания длины типов, т.е. приведенную выше структуру следует записать в следующем виде:
1.3.6. Мультипликативные операции
К этому классу операций относятся операции умножения (*), деления (/) и получение остатка от деления (%). Операндами операции (%) должны быть целые числа. Отметим, что типы операндов операций умножения и деления могут отличаться, и для них справедливы правила преобразования типов. Типом результата является тип операндов после преобразования.
Операция умножения (*) выполняет умножение операндов.
Тип произведения i и f преобразуется к типу double, затем результат присваивается переменной g.
Операция деления (/) выполняет деление первого операнда на второй. Если две целые величины не делятся нацело, то результат округляется в сторону нуля.
При попытке деления на ноль выдается сообщение во время выполнения.
Операция остаток от деления (%) дает остаток от деления первого операнда на второй.
Знак результата зависит от конкретной реализации. В данной реализации знак результата совпадает со знаком делимого. Если второй операнд равен нулю, то выдается сообщение.
1.3.7. Аддитивные операции
К аддитивным операциям относятся сложение (+) и вычитание (-). Операнды могут быть целого или плавающего типов. В некоторых случаях над операндами аддитивных операций выполняются общие арифметические преобразования. Однако преобразования, выполняемые при аддитивных операциях, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат аддитивной операции не может быть представлен типом операндов после преобразования. При этом сообщение об ошибке не выдается.
Когда целая величина складывается с указателем, то целая величина преобразуется путем умножения ее на размер памяти, занимаемой величиной, адресуемой указателем.
Когда преобразованная целая величина складывается с величиной указателя, то результатом является указатель, адресующий ячейку памяти, расположенную на целую величину дальше от исходного адреса. Новое значение указателя адресует тот же самый тип данных, что и исходный указатель.
Операция вычитания (-) вычитает второй операнд из первого. Возможна следующая комбинация операндов:
1. Оба операнда целого или плавающего типа.
2. Оба операнда являются указателями на один и тот же тип.
Отметим, что операции сложения и вычитания над адресами в единицах, отличных от длины типа, могут привести к непредсказуемым результатам.
1.3.8. Операции сдвига
Операции сдвига осуществляют смещение операнда влево ( >) на число битов, задаваемое вторым операндом. Оба операнда должны быть целыми величинами. Выполняются обычные арифметические преобразования. При сдвиге влево правые освобождающиеся биты устанавливаются в нуль. При сдвиге вправо метод заполнения освобождающихся левых битов зависит от типа первого операнда. Если тип unsigned, то свободные левые биты устанавливаются в нуль. В противном случае они заполняются копией знакового бита. Результат операции сдвига не определен, если второй операнд отрицательный.
Преобразования, выполненные операциями сдвига, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат операции сдвига не может быть представлен типом первого операнда, после преобразования.
Отметим, что сдвиг влево соответствует умножению первого операнда на степень числа 2, равную второму операнду, а сдвиг вправо соответствует делению первого операнда на 2 в степени, равной второму операнду.
1.3.9. Поразрядные операции
К поразрядным операциям относятся: операция поразрядного логического «И» (&), операция поразрядного логического «ИЛИ» (|), операция поразрядного «исключающего ИЛИ» (^).
Операция поразрядного логического И (&) сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если оба сравниваемых бита единицы, то соответствующий бит результата устанавливается в 1, в противном случае в 0.
Операция поразрядного логического ИЛИ (|) сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если любой (или оба) из сравниваемых битов равен 1, то соответствующий бит результата устанавливается в 1, в противном случае результирующий бит равен 0.
Операция поразрядного исключающего ИЛИ (^) сравнивает каждый бит первого операнда с соответствующими битами второго операнда. Если один из сравниваемых битов равен 0, а второй бит равен 1, то соответствующий бит результата устанавливается в 1, в противном случае, т.е. когда оба бита равны 1 или 0, бит результата устанавливается в 0.
1.3.10. Логические операции
К логическим операциям относятся операция логического И (&&) и операция логического ИЛИ (||). Операнды логических операций могут быть целого типа, плавающего типа или типа указателя, при этом в каждой операции могут участвовать операнды различных типов.
Операнды логических выражений вычисляются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, то второй операнд не вычисляется.
Логические операции не вызывают стандартных арифметических преобразований. Они оценивают каждый операнд с точки зрения его эквивалентности нулю. Результатом логической операции является 0 или 1, тип результата int.
Операция логического И (&&) вырабатывает значение 1, если оба операнда имеют нулевые значения. Если один из операндов равен 0, то результат также равен 0. Если значение первого операнда равно 0, то второй операнд не вычисляется.
Операция логического ИЛИ (||) выполняет над операндами операцию включающего ИЛИ. Она вырабатывает значение 0, если оба операнда имеют значение 0, если какой-либо из операндов имеет ненулевое значение, то результат операции равен 1. Если первый операнд имеет ненулевое значение, то второй операнд не вычисляется.
1.3.11. Операция последовательного вычисления
Операция последовательного вычисления обозначается запятой (,) и используется для вычисления двух и более выражений там, где по синтаксису допустимо только одно выражение. Эта операция вычисляет два операнда слева направо. При выполнении операции последовательного вычисления, преобразование типов не производится. Операнды могут быть любых типов. Результат операции имеет значения и тип второго операнда. Отметим, что запятая может использоваться также как символ разделитель, поэтому необходимо по контексту различать, запятую, используемую в качестве разделителя или знака операции.
1.3.12. Условная операция
Операнд-1 должен быть целого или плавающего типа или быть указателем. Он оценивается с точки зрения его эквивалентности 0. Если операнд-1 не равен 0, то вычисляется операнд-2 и его значение является результатом операции. Если операнд-1 равен 0, то вычисляется операнд-3 и его значение является результатом операции. Следует отметить, что вычисляется либо операнд-2, либо операнд-3, но не оба. Тип результата зависит от типов операнда-2 и операнда-3, следующим образом.
1. Если операнд-2 или операнд-3 имеет целый или плавающий тип (отметим, что их типы могут отличаться), то выполняются обычные арифметические преобразования. Типом результата является тип операнда после преобразования.
2. Если операнд-2 и операнд-3 имеют один и тот же тип структуры, объединения или указателя, то тип результата будет тем же самым типом структуры, объединения или указателя.
3. Если оба операнда имеют тип void, то результат имеет тип void.
4. Если один операнд является указателем на объект любого типа, а другой операнд является указателем на vold, то указатель на объект преобразуется к указателю на vold, который и будет типом результата.
5. Если один из операндов является указателем, а другой константным выражением со значением 0, то типом результата будет тип указателя.