Какой операции нет в c
В C# используется большинство операций, которые применяются и в других языках программирования. Операции представляют определенные действия над операндами — участниками операции. В качестве операнда может выступать переменной или какое-либо значение (например, число). Операции бывают унарными (выполняются над одним операндом), бинарными — над двумя операндами и тернарными — выполняются над тремя операндами. Рассмотрим все виды операций.
Бинарные арифметические операции:
- + Операция сложения двух чисел:
int x = 10; int z = x + 12; // 22
int x = 10; int z = x - 6; // 4
int x = 10; int z = x * 5; // 50
int x = 10; int z = x / 5; // 2 double a = 10; double b = 3; double c = a / b; // 3.33333333
При делении стоит учитывать, что если оба операнда представляют целые числа, то результат также будет округляться до целого числа:
double z = 10 / 4; //результат равен 2
Несмотря на то, что результат операции в итоге помещается в переменную типа double, которая позволяет сохранить дробную часть, но в самой операции участвуют два литерала, которые по умолчанию рассматриваются как объекты int, то есть целые числа, и результат то же будет целочисленный. Для выхода из этой ситуации необходимо определять литералы или переменные, участвующие в операции, именно как типы double или float:
double z = 10.0 / 4.0; //результат равен 2.5
double x = 10.0; double z = x % 4.0; //результат равен 2
Также есть ряд унарных операций, в которых принимает участие один операнд:
- ++ Операция инкремента Инкремент бывает префиксным: ++x — сначала значение переменной x увеличивается на 1, а потом ее значение возвращается в качестве результата операции.
И также существует постфиксный инкремент: x++ — сначала значение переменной x возвращается в качестве результата операции, а затем к нему прибавляется 1.
int x1 = 5; int z1 = ++x1; // z1=6; x1=6 Console.WriteLine($" - "); int x2 = 5; int z2 = x2++; // z2=5; x2=6 Console.WriteLine($" - ");
int x1 = 5; int z1 = --x1; // z1=4; x1=4 Console.WriteLine($" - "); int x2 = 5; int z2 = x2--; // z2=5; x2=4 Console.WriteLine($" - ");
При выполнении сразу нескольких арифметических операций следует учитывать порядок их выполнения. Приоритет операций от наивысшего к низшему:
- Инкремент, декремент
- Умножение, деление, получение остатка
- Сложение, вычитание
Для изменения порядка следования операций применяются скобки.
Рассмотрим набор операций:
int a = 3; int b = 5; int c = 40; int d = c---b*a; // a=3 b=5 c=39 d=25 Console.WriteLine($"a= b= c= d=");
Здесь мы имеем дело с тремя операциями: декремент, вычитание и умножение. Сначала выполняется декремент переменной c, затем умножение b*a, и в конце вычитание. То есть фактически набор операций выглядел так:
int d = (c--)-(b*a);
Но с помощью скобок мы могли бы изменить порядок операций, например, следующим образом:
int a = 3; int b = 5; int c = 40; int d = (c-(--b))*a; // a=3 b=4 c=40 d=108 Console.WriteLine($"a= b= c= d=");
Ассоциативность операторов
Как выше было отмечено, операции умножения и деления имеют один и тот же приоритет, но какой тогда результат будет в выражении:
int x = 10 / 5 * 2;
Стоит нам трактовать это выражение как (10 / 5) * 2 или как 10 / (5 * 2) ? Ведь в зависимости от трактовки мы получим разные результаты.
Когда операции имеют один и тот же приоритет, порядок вычисления определяется ассоциативностью операторов. В зависимости от ассоциативности есть два типа операторов:
- Левоассоциативные операторы, которые выполняются слева направо
- Правоассоциативные операторы, которые выполняются справа налево
Все арифметические операторы являются левоассоциативными, то есть выполняются слева направо. Поэтому выражение 10 / 5 * 2 необходимо трактовать как (10 / 5) * 2 , то есть результатом будет 4.
Какой операции нет в c
Оператор ветвления if в зависимости от условия позволяет выбрать одно из двух возможных продолжений программы. Схематично этот оператор можно изобразить так, как показано на рисунке ниже:
Формально в терминах языка программирования это можно записать так:
Оператор ветви «Да» ;
Оператор ветви «Нет» ;
Оператор работает следующим образом: вычисляется записанное в круглых скобках выражение-условие , если оно истинно , то выполняется Оператор ветви «Да» , если ложно — то Оператор ветви «Нет» . После этого управление передаётся на следующий оператор.
Условие — это некоторое выражение, имеющее результат логического или арифметического типа. Условие всегда должно записываться в круглых скобках. Примеры записи условий:
if(a>b) — простое условие, используется операция сравнения;
if(a+b) — а здесь условие содержит арифметическое выражение (сложение двух чисел).
Если в первых двух случаях всё делается так, как и во многих других языках программирования, то вот сумма двух чисел в качестве результата вычисления условия в операторе if может поставить в тупик. Как трактовать такое условие?
Всё очень просто. В языке C не было логического типа данных, поэтому считалось, что число 0 — это ложь , а любое, отличное от 0 число — это истина . В C++ есть логический тип данных ( bool ), но для совместимости с языком C это правило также поддерживается.
По любой из ветвей оператора if положено записывать только один оператор. Если по логике программы требуется не один, а более операторов, то их с помощью фигурных скобок объединяют в блок. Таким образом, по обеим ветвям можно в итоге записывать любое количество любых операторов. В том числе и ни одного.
Пример 1 . Дано натуральное число n . Определить, является ли оно двухзначным или нет.
Возможный текст программы:
using namespace std;
Пример 2 . Даны три числа: a , b , c . Могут ли эти числа быть длинами сторон треугольника? Если «да», то вычислить его площадь, используя формулу Герона:
Возможный текст программы:
using namespace std;
double a, b, c, p, s;
if(a + b > c && b + c > a && a+ c > b)
s = sqrt(p * (p — a) * (p — b) * (p — c));
Условная операция ? :
В языках C/C++ есть одна единственная трёхместная операция — условная операция . Она имеет два специальных символа, разделяющих три части операции. Именно поэтому операция является трёхместной. В ряде случаев её удобно использовать вместо оператора if .
Формальная запись условной операции:
Условие ? Выражение_Да : Выражение_Нет
Условие — логическое или арифметическое выражение, подобное тому, которое можно записать в операторе if ;
Выражение_Да и Выражение_Нет — выражения одного типа (или приводимого к какому-то одному типу).
Вычисление операции выполняется следующим образом. Вначале вычисляется Условие , записанное до символа ? (вопросительный знак). Если условие истинно, то результатом работы операции будет Выражение_Да , если ложно, то Выражение_Нет . Как видно из формальной записи, Выражение_Да и Выражение_Нет разделены символом : (двоеточие).
Результат вычисления условной операции можно присвоить какой-либо переменной или вывести на печать.
Пример 3 . Вычислить максимум из двух чисел.
а)Реализация с помощью условной операции:
max = a > b ? a : b;
б)Реализация с помощью оператора if :
Пример 4 . Дано целое число a , определить, является ли оно чётным или нечётным.
а)Так можно сделать с помощью условной операции:
б)А так делается с помощью оператора if :
Когда применять условную операцию? Лучше всего в простых ситуациях, когда по обеим ветвям в зависимости от истинности условия надо присвоить переменной то или иное значение (как в Примере 3 , а).
Когда действия по ветвям разные, то приемлем только оператор ветвления if .
Урок №17. Операторы
Как мы уже знаем из предыдущих уроков, выражение — это математический объект, который имеет определенное значение. Однако, термин «математический объект» несколько расплывчатый. Точнее будет так: выражение — это комбинация литералов, переменных, функций и операторов, которая генерирует (создает) определенное значение.
Оглавление:
Литералы
Литерал — это фиксированное значение, которое записывается непосредственно в исходном коде (например, 7 или 3.14159 ). Вот пример программы, которая использует литералы:
int a = 3 ; // a – это переменная, 3 – это литерал
std :: cout << 5 + 2 ; // 5 + 2 – это выражение, 5 и 2 – это литералы std :: cout << "Hello, world!" ; // "Hello, world" – это тоже литерал
Литералы, переменные и функции еще известны как операнды. Операнды — это данные, с которыми работает выражение. Литералы имеют фиксированные значения, переменным можно присваивать значения, функции же генерируют определенные значения (в зависимости от типа возврата, исключением являются функции типа void).
Операторы
Последним пазлом в выражениях являются операторы. С их помощью мы можем объединить операнды для получения нового значения. Например, в выражении 5 + 2 , + является оператором. С помощью + мы объединили операнды 5 и 2 для получения нового значения ( 7 ).
Вы, вероятно, уже хорошо знакомы со стандартными арифметическими операторами из школьной математики: сложение ( + ), вычитание ( — ), умножение ( * ) и деление ( / ). Знак равенства = является оператором присваивания. Некоторые операторы состоят более чем из одного символа, например, оператор равенства == , который позволяет сравнивать между собой два определенных значения.
Примечание: Очень часто новички путают оператор присваивания ( = ) с оператором равенства ( == ). С помощью оператора присваивания ( = ) мы присваиваем переменной определенное значение. С помощью оператора равенства ( == ) мы проверяем, равны ли между собой два определенных операнда.
Операторы бывают трёх типов:
Унарные. Работают с одним операндом. Например, оператор − (минус). В выражении −7 , оператор − применяется только к одному операнду ( 7 ), чтобы создать новое значение ( −7 ).
Бинарные. Работают с двумя операндами (левым и правым). Например, оператор + . В выражении 5 + 2 , оператор + работает с левым операндом ( 5 ) и правым ( 2 ), чтобы создать новое значение ( 7 ).
Тернарные. Работают с тремя операндами (в языке C++ есть только один тернарный оператор).
Обратите внимание, некоторые операторы могут иметь несколько значений. Например, оператор − (минус) может использоваться в двух контекстах: как унарный для изменения знака числа (например, конвертировать 7 в −7 и наоборот), и как бинарный для выполнения арифметической операции вычитания (например, 4 — 3 ).
Заключение
Это только верхушка айсберга. Более детально об операторах мы обязательно поговорим на следующих уроках.
Операции в языке Си
Над объектами в языке Си могут выполняться различные операции:
- операции присваивания;
- операции отношения;
- арифметические;
- логические;
- сдвиговые операции.
Результатом выполнения операции является число.
Операции могут быть бинарными или унарными.
Бинарные операции выполняются над двумя объектами, унарные — над одним.
Операция присваивания
Операция присваивания обозначается символом = и выполняется в 2 этапа:
- вычисляется выражение в правой части;
- результат присваивается операнду, стоящему в левой части:
объект = выражение;
int a = 4; // переменной a присваивается значение 4
int b;
b = a + 2; // переменной b присваивается значение 6, вычисленное в правой части
В случае если объекты в левой и правой части операции присваивания имеют разные типы используется операция явного приведения типа.
объект = (тип)выражение;
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 и могут выполняться над любыми объектами. Результат условной логической операции:
- 1 если выражение истинно;
- 0 если выражение ложно.
Вообще, все значения, отличные от нуля, интерпретируются условными логическими операциями как истинные.
Основные условные логические операции:
- && — И (бинарная) — требуется одновременное выполнение всех операций отношения;
- || — ИЛИ (бинарная) — требуется выполнение хотя бы одной операции отношения;
- ! — НЕ (унарная) — требуется невыполнение операции отношения.
Побитовые логические операции оперируют с битами, каждый из которых может принимать только два значения: 0 или 1.
Основные побитовые логические операции в языке Си:
- & конъюнкция (логическое И) — бинарная операция, результат которой равен 1 только когда оба операнда единичны (в общем случае — когда все операнды единичны);
- | дизъюнкция (логическое ИЛИ) — бинарная операция, результат которой равен 1 когда хотя бы один из операндов равен 1;
- ~ инверсия (логическое НЕ) — унарная операция, результат которой равен 0 если операнд единичный, и равен 1, если операнд нулевой;
- ^ исключающее ИЛИ — бинарная операция, результат которой равен 1, если только один из двух операндов равен 1 (в общем случае если во входном наборе операндов нечетное число единиц).
Для каждого бита результат выполнения операции будет получен в соответствии с таблицей.
a | b | a & b | a | b | ~a | a ^ b |
0 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 0 | 0 |
unsigned char a = 14; // a = 0000 1110
unsigned char b = 9; // b = 0000 1001
unsigned char c, d, e, f;
c = a & b; // c = 8 = 0000 1000
d = a | b; // d = 15 = 0000 1111
e = ~a; // e = 241 = 1111 0001
f = a ^ b; // f = 7 = 0000 0111
Побитовые операции позволяют осуществлять установку и сброс отдельных битов числа. С этой целью используется маскирование битов . Маски, соответствующие установке каждого бита в байте, представлены в таблице
Бит | Маска |
0 | 0x01 |
1 | 0x02 |
2 | 0x04 |
3 | 0x08 |
4 | 0x10 |
5 | 0x20 |
6 | 0x40 |
7 | 0x80 |
Для установки определенного бита необходимо соответствующий бит маски установить в 1 и произвести операцию побитового логического ИЛИ с константой, представляющей собой маску:
unsigned char a = 3;
a = a | 0x04; // a = 7, бит 2 установлен
Для сброса определенного бита необходимо соответствующий бит маски сбросить в 0 и произвести операцию побитового логического И с константой, представляющей собой инверсную маску:
unsigned char a = 3;
a = a & (~0x02); // a = 1, бит 1 сброшен
Бинарные побитовые логические операции могут быть объединены с операцией присваивания:
- объект &= выражение; // объект = объект & выражение
- объект |= выражение; // объект = объект | выражение
- объект ^= выражение; // объект = объект ^ выражение
Сдвиговые операции
Операции арифметического сдвига применяются в целочисленной арифметике и обозначаются как:
Общий синтаксис осуществления операции сдвига:
объект = выражение сдвиг КоличествоРазрядов;
unsigned char a=6; // a = 0000 0110
unsigned char b;
b = a >> 1; // b = 0000 0110 >> 1 = 0000 0011 = 3
Арифметический сдвиг целого числа вправо >> на 1 разряд соответствует делению числа на 2.
Арифметический сдвиг целого числа влево на 1 разряд соответствует умножению числа на 2.