Операция поразрядного «И» (&) сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если оба сравниваемых бита единицы, то соответствующий бит результата устанавливается в 1, в противном случае в 0.
Операция поразрядного «ИЛИ» (|) сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если любой (или оба) из сравниваемых битов равен 1, то соответствующий бит результата устанавливается в 1, в противном случае результирующий бит равен 0.
Операция поразрядного «исключающего ИЛИ» (^) сравнивает каждый бит первого операнда с соответствующим битом второго операнда. Если один из сравниваемых битов равен 0, а второй бит равен 1, то соответствующий бит результата устанавливается в 1, в противном случае, т. е. когда оба бита равны 1 или 0, бит результата устанавливается в 0.
Пример:
К логическим относятся операция логического «И» (&&) и операция логического «ИЛИ» (||). Операнды логических операций могут быть целого типа, плавающего типа или типа указателя, при этом в каждой операции могут участвовать операнды различных типов.
Операнды логических выражений вычисляются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, то второй операнд не вычисляется.
Логические операции не вызывают стандартных арифметических преобразований. Они оценивают каждый операнд с точки зрения его эквивалентности нулю. Результатом логической операции является 0 или 1, тип результата int.
Операция логического «И» (&&) вырабатывает значение 1, если оба операнда имеют ненулевые значения. Если хотя бы один из операндов равен 0, то результат также равен 0. Если значение первого операнда равно 0, то второй операнд не вычисляется.
Операция логического «ИЛИ» (||) выполняет над операндами операцию включающего ИЛИ. Она вырабатывает значение 0, если оба операнда имеют значение 0, если какой-либо из операндов имеет ненулевое значение, то результат операции равен 1. Если первый операнд имеет ненулевое значение, то второй операнд не вычисляется.
Операция последовательного вычисления обозначается запятой (,) и используется для вычисления двух и более выражений там, где по синтаксису допустимо только одно выражение. Эта операция вычисляет два операнда слева направо. При выполнении операции последовательного вычисления преобразование типов не производится. Операнды могут быть любых типов. Результат операции имеет значения и тип второго операнда. Отметим, что запятая может использоваться также, как символ разделитель, поэтому необходимо по контексту различать запятую, используемую в качестве разделителя или знака операции.
В языке С-51 имеется одна тернарная операция — условная операция:
Операнд1 '?' Операнд2 ':' ОперандЗ
В условной операции
Если
1. Если операнды имеют целый или плавающий тип (отметим, что их типы могут отличаться), то выполняются обычные арифметические преобразования. Типом результата является тип операнда после преобразования.
2. Если оба операнда имеют один и тот же тип структуры, объединения или указателя, то тип результата будет тем же самым типом структуры, объединения или указателя.
3. Если оба операнда имеют тип void, то результат имеет тип void.
4. Если один операнд является указателем на объект любого типа, а другой операнд является указателем на void, то указатель на объект преобразуется к указателю на void, который и будет типом результата.
5. Если один из операндов является указателем, а другой константным выражением со значением 0, то типом результата будет тип указателя.
Пример:
max = (d<=b)? b: d;
Переменной max присваивается максимальное значение переменных
Операции инкремента (++) и декремента (-) являются унарными операциями присваивания. Они соответственно увеличивают или уменьшают значения операнда на единицу. Эти операции обычно используются для организации циклов и перехода от адреса одной переменной к адресу другой переменной. Операнд может быть целого или плавающего типа или быть указателем и при этом обязательно должен быть модифицируемым. Тип результата соответствует типу операнда. Операнд адресного типа увеличивается или уменьшается на размер объекта, который он адресует.