Над объектами в языке Си могут выполняться различные операции:
- операции присваивания;
- операции отношения;
- арифметические;
- логические;
- сдвиговые операции.
Результатом выполнения операции является число.
Операции могут быть бинарными или унарными.
Бинарные операции выполняются над двумя объектами, унарные — над одним.
Операция присваивания
Операция присваивания обозначается символом = и выполняется в 2 этапа:
- вычисляется выражение в правой части;
- результат присваивается операнду, стоящему в левой части:
объект = выражение;
int a = 4; // переменной a присваивается значение 4
int b;
b = a + 2; // переменной b присваивается значение 6, вычисленное в правой части
В случае если объекты в левой и правой части операции присваивания имеют разные типы используется операция явного приведения типа.
объект = (тип)выражение;
#6 Арифметические команды сложения ADD и ADC
float a = 241.5;
// Перед вычислением остатка от деления a приводится к целому типу
int b = ( int )a % 2; // b = 1
Операции отношения
Основные операции отношения:
Операции отношения используются при организации условий и ветвлений. Результатом этих операций является 1 бит, значение которого равно 1 , если результат выполнения операции — истина, и равно 0 , если результат выполнения операции — ложь.
Арифметические операции
Основные бинарные операции, расположенные в порядке уменьшения приоритета:
Основные унарные операции:
- ++ — инкрементирование (увеличение на 1);
- –– — декрементирование (уменьшение на 1);
- — — изменение знака.
Результат вычисления выражения, содержащего операции инкрементирования или декрементирования, зависит от того, где расположен знак операции (до объекта или после него). Если операция расположена до объекта, то сначала происходит изменение значения переменной на 1, а потом это значение используется для выполнения следующих операций. Если операция ++ или — расположена после переменной, то сначала выполняется операция, а потом значение переменной изменяется на 1.
int a=2;
int b=3;
int c;
c = a*++b;
// c=8, поскольку в операции умножения
//уже b=4
int a=2;
int b=3;
int d;
d = a*b++;
// d=6, поскольку в операции умножения b=3,
// следующим действием будет b=4
Бинарные арифметические операции могут быть объединены с операцией присваивания:
- объект *= выражение; // объект = объект * выражение
- объект /= выражение; // объект = объект / выражение
- объект += выражение; // объект = объект + выражение
- объект -= выражение; // объект = объект — выражение
- объект %= выражение; // объект = объект % выражение
Логические операции
Логические операции делятся на две группы:
Условные логические операции чаще всего используются в операциях проверки условия if и могут выполняться над любыми объектами. Результат условной логической операции:
ОПЕРАТОРЫ. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ С ЧИСЛАМИ В C# | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ | Урок # 8
- 1 если выражение истинно;
- 0 если выражение ложно.
Вообще, все значения, отличные от нуля, интерпретируются условными логическими операциями как истинные.
Основные условные логические операции:
- — И (бинарная) — требуется одновременное выполнение всех операций отношения;
- || — ИЛИ (бинарная) — требуется выполнение хотя бы одной операции отношения;
- ! — НЕ (унарная) — требуется невыполнение операции отношения.
Побитовые логические операции оперируют с битами, каждый из которых может принимать только два значения: 0 или 1.
Основные побитовые логические операции в языке Си:
- | дизъюнкция (логическое ИЛИ) — бинарная операция, результат которой равен 1 когда хотя бы один из операндов равен 1;
- ~ инверсия (логическое НЕ) — унарная операция, результат которой равен 0 если операнд единичный, и равен 1, если операнд нулевой;
- ^ исключающее ИЛИ — бинарная операция, результат которой равен 1, если только один из двух операндов равен 1 (в общем случае если во входном наборе операндов нечетное число единиц).
Для каждого бита результат выполнения операции будет получен в соответствии с таблицей.
a | b | a // a = 0000 1110 unsigned char b = 9; // b = 0000 1001 unsigned char c, d, e, f; c = a // c = 8 = 0000 1000 d = a | b; // d = 15 = 0000 1111 e = ~a; // e = 241 = 1111 0001 f = a ^ b; // f = 7 = 0000 0111 Побитовые операции позволяют осуществлять установку и сброс отдельных битов числа. С этой целью используется маскирование битов . Маски, соответствующие установке каждого бита в байте, представлены в таблице
Для установки определенного бита необходимо соответствующий бит маски установить в 1 и произвести операцию побитового логического ИЛИ с константой, представляющей собой маску:
unsigned char a = 3; Для сброса определенного бита необходимо соответствующий бит маски сбросить в 0 и произвести операцию побитового логического И с константой, представляющей собой инверсную маску:
unsigned char a = 3; Бинарные побитовые логические операции могут быть объединены с операцией присваивания:
Сдвиговые операцииОперации арифметического сдвига применяются в целочисленной арифметике и обозначаются как: Общий синтаксис осуществления операции сдвига: unsigned char a=6; // a = 0000 0110 Арифметический сдвиг целого числа вправо >> на 1 разряд соответствует делению числа на 2. Комментариев к записи: 41Источник: prog-cpp.ru С примеры арифметических программЯзык программирования Си поддерживает все основные арифметические операции. Эти операции производятся над числами. Значения, которые участвуют в операции, называются операндами. Список имеющихся в Си операций:
#include int main(void) < int a = 67; int b = 33; int c = a + b + 7; printf(«a + b + 7 = %d n», c); // 107 return 0; > При делении стоит быть внимательным, так как если в операции участвуют два целых числа, то результат деления будет округляться до целого числа, даже если результат присваивается переменной float: float f = 10 / 4; printf(«f = %f n», f); // 2.0 Результат представлял вещественное число, один из операндов также должен представлять вещественное число: float f = 10.0 / 4; printf(«f = %f n», f); // 2.5 Операции *, /, % имеют больший приоритет, чем + и — : int a = 8; int b = 7; int c = a + 5 * b; // 43 printf(«c = %d n», c); // 43 Здесь результатом будет число 43:
С помощью скобок мы можем переопределить порядок операций, сделав, чтобы операции с более низким приоритетом выполнялись до операций с более высоким приоритетом: int a = 8; int b = 7; int c = (a + 5) * b; // 91 Здесь результатом будет число 91:
Также в Си есть специальные унарные операции над одним числом: ++ (инкремент) и — (декремент). Каждая из операций имеет две разновидности: префиксная и постфиксная.
int a = 8; int b = ++a; printf(«a = %d n», a); // 9 printf(«b = %d», b); // 9 Рассмотрим более сложную ситуацию: int a = 8; int b = 7; int c = a+++b; printf(«a = %d n», a); // 9 printf(«b = %d n», b); // 7 printf(«c = %d n», c); // 15 Здесь операция трактуются таким образом, что вначале идет постфиксный инкремент, а потом сложение. То есть фактически так: int c = (a++) + b; Аналогично будет расцениваться выражения с постфиксным декрементом: int c = a—b; . Источник: metanit.com 5.2 – Арифметические операторыВ C++ есть два унарных арифметических оператора, плюс (+) и минус (-). Напоминаем, что унарные операторы – это операторы, которые принимают только один операнд.
Оператор унарного минуса возвращает операнд, умноженный на -1 . Другими словами, если x = 5 , -x равно -5 . Оператор унарного плюса возвращает значение операнда. Другими словами, +5 равно 5 , а +x равно x . Как правило, вам не нужно использовать этот оператор, поскольку он избыточен. Он был добавлен в основном для обеспечения симметрии с унарным оператором минус. Для наилучшего эффекта оба этих оператора следует размещать непосредственно перед операндом (например, -x , а не — x ). Не путайте оператор унарного минуса с оператором бинарного вычитания, в котором используется тот же символ. Например, в выражении x = 5 — -3; первый минус – это оператор бинарного вычитания, а второй – оператор унарного минуса. Бинарные арифметические операторыВ C++ есть 5 бинарных арифметических операторов. Бинарные операторы – это операторы, которые принимают левый и правый операнды.
Операторы сложения, вычитания и умножения работают так же, как и в реальной жизни, без каких-либо оговорок. Деление и остаток от деления требуют дополнительных пояснений. О делении мы поговорим ниже, а об остатке от деления – в следующем уроке. Целочисленное деление и деление с плавающей запятойПроще всего представить себе, что оператор деления имеет два разных «режима». Если один (или оба) операнда являются значениями с плавающей точкой, оператор деления выполняет деление с плавающей точкой. Деление с плавающей точкой возвращает значение с плавающей точкой, и дробная часть сохраняется. Например, 7.0 / 4 = 1.75 , 7 / 4.0 = 1.75 и 7.0 / 4.0 = 1.75 . Как и во всех арифметических операциях с плавающей точкой, здесь могут возникать ошибки округления. Если оба операнда являются целыми числами, оператор деления вместо этого выполняет целочисленное деление. Целочисленное деление отбрасывает любые дробные части и возвращает целочисленное значение. Например, 7 / 4 = 1 , потому что дробная часть результата отбрасывается. Точно так же -7 / 4 = -1 , потому что дробная часть опускается. Предупреждение До C++11 целочисленное деление с отрицательным операндом могло округляться в большую или меньшую сторону. Таким образом, -5 / 3 могло дать результат -1 или -2 . Это было исправлено в C++11, где дробная часть всегда отбрасывается (округляется до 0). Использование static_cast<> для деления с плавающей точкой с целочисленными значениямиСказанное выше поднимает вопрос: если у нас есть два целых числа и мы хотим разделить их без потери дробной части, как нам это сделать? В уроке «4.11 – Символы» мы показали, как можно использовать оператор static_cast<> для преобразования значения char в целочисленный тип, чтобы оно печаталось как целое число, а не как символ. Аналогичным образом мы можем использовать static_cast<> для преобразования значения целочисленного типа в число с плавающей точкой, чтобы мы, вместо целочисленного деления, смогли выполнить деление с плавающей точкой. Рассмотрим следующий код: #include int main() < int x< 7 >; int y< 4 >; std::cout (x) / y (y) int / int = 1 double / int = 1.75 int / double = 1.75 double / double = 1.75 Приведенный выше пример показывает, что если любой из операндов является числом с плавающей точкой, результатом будет деление с плавающей точкой, а не целочисленное деление. Деление на нольПопытка разделить на 0 (или 0.0) обычно приводит к сбою программы, так как результаты математически не определены! #include int main() < std::cout ; std::cin >> x; std::cout Арифметические операторы присваивания | ||||||||||||||||||||||||||||||||||||||||||||||
Присваивание | = | x = y | Присвоить значение y переменной x | |||||||||||||||||||||||||||||||||||||||||||||
Сложение с присваиванием | += | x += y | Добавить y к x | |||||||||||||||||||||||||||||||||||||||||||||
Вычитание с присваиванием | -= | x -= y | Вычесть y из x | |||||||||||||||||||||||||||||||||||||||||||||
Умножение с присваиванием | *= | x *= y | Умножить x на y | |||||||||||||||||||||||||||||||||||||||||||||
Деление с присваиванием | /= | x /= y | Разделить x на y | |||||||||||||||||||||||||||||||||||||||||||||
Остаток от деления с присваиванием | %= | x %= y | Положить остаток от x / y в x |