Следует различать термины "операция" (выполняемое действие) и "оператор" (обозначение для операции). Во-первых, в разных языках программирования для одной и той же операции могут применяться разные обозначения, например, деление нацело в Python обозначается //
, а в Pascal – div
. Во-вторых, одно обозначение может использоваться для разных операций в зависимости от типа аргументов, например, в С++ <<
может означать операцию сдвига битов для целых чисел или операцию вывода для потоков ввода-вывода. В С такая неоднозначность только одна: символ /
может обозначать обычное деление или деление нацело, если оба аргумента операции – целые числа.
Операция присваивания позволяет поместить в переменную новое значение. При необходимости происходит преобразование, при помещении вещественного значения в целую переменную отбрасывается дробная часть, а также возможно переполнение, обработка которого зависит от настроек компилятора.
int a; // a=?
a=5; // a=5
a=7.5; // a=7
a=1e10; // переполнение a=INT_MAX
Можно присвоить значение нескольким переменным:
int a,b,c;
a=b=c=1; // a=1, b=1, c=1
double x;
x=a=7.5; // эквивалентно a=7.5; x=a;
Для выполнения арифметических действий используются операции x+y
, x-y
, x*y
и x/y
. Операции умножения и деления имеют более высокий приоритет, чем сложение и вычитание, при необходимости используются скобки. Арифметические операции выполняются слева направо. Для смены знака используется операция -x
.
Тип результата арифметической операции определяется максимумом из размеров аргументов, поэтому при вычислениях с целыми возможно переполнение. Если один из аргументов имеет вещественный тип, то второй аргумент тоже преобразуется к вещественному типу.
double a;
a = 2+2*2; // a=6
a = -a; // a=-6
a=10000*1000000; // переполнение a=1410065408
a=10000.0*1000000; // a=1e10
Если оба аргумента операции x/y
являются целыми, то выполняется деление нацело. Для выполнения обычного деления один из аргументов операции нужно преобразовать в вещественное. Для этого нужно использовать операцию преобразования: (тип)e
.
Для нахождения остатка от деления используются операция x%y
, оба аргумента операции должны иметь целый тип.
double a;
a=7/5; // a=1
a=7.0/5; // a=1.4
a=(double)7/5; // a=1.4
a=7%5; // a=2
В математике и связанной с ней криптографии рассматриваются арифметические операции по модулю натурального числа m: x . Для x>=0 значение x%m
и математического x\ (mod m) совпадает, но для x<0 остаток не положительный, тогда в математике результат всегда неотрицательный независимо от знака x, поэтому в общем случае формулу x\ (mod m) нужно записывать в программировании как ((x%m)+m)%m)
.
Часто при выполнении вычислений требуется выполнить одно арифметическое действие на переменной и результат вычислений поместить в ту же переменную. Для этого в языке С были добавлены специальные операции x+=y
, x-=y
, x*=y
, x/=y
и x%=y
.
int a=5;
a+=6; // эквивалентно a=a+6; результат a=11
a*=a+1; // эквивалентно a=a*(a+1); результат a=132
Пи выполнении циклов часто нужно изменять значение переменной на 1. Для этих целей в С используются операции ++x
(инкремент) и --x
(декремент).
int a=1;
++a; // эквивалентно a+=1; результат a=2
--a; // эквивалентно a-=1; результат a=1
Кроме префиксной формы инкремента и декремента в С иногда используется постфиксные формы этих операций: x++
и x--
. Отличаются они возвращаемым значением, результатом постфиксной формы является значение изменяемой переменной до изменения.
int a, b=1;
a=++b; // результат a=2, b=2
// эквивалентно оператору a=(b=b+1);
a=b++; // результат a=2, b=3
// эквивалентно операторам int temp=b; b=b+1; a=temp;
Порядок вычисления аргументов большинства бинарных операций в языке С определяется компилятором и может зависеть от его настроек. Поэтому не рекомендуется использовать в одном выражении несколько операций, изменяющих одну и ту же переменную, например, ++i - ++i
.
Операцию присваивания можно использовать внутри выражения, чтобы запомнить промежуточные результаты. С помощью операции x,y
можно сделать несколько последовательных вычислений, сначала вычисляется левый аргумент операции, затем правый и его значение является результатом этой операции.
int a,b,c;
c=(a=input("a:"), b=input("b:"), a+b);
// эквивалентно a=input("a:"); b=input("b:"); c=a+b;
Этой операцией лучше не злоупотреблять, так как программа становится менее понятной, и невозможно при отладке посмотреть промежуточные результаты вычислений, так как шагом отладки является выполнение одного оператора программы.