В операторах и выражениях должны быть данные одного и того же типа. Но на Си возможно это нарушить (в отличии от Паскаля). Си компилятор автоматически преобразует типы, но следует соблюдать определенные правила:
1.Если производится операция над данными 2-х разных типов, то обе величины приводятся к высшему типу (происходит "повышение" типа).
2. Типы от высшего к низшему: double, float, long, int, short, char. Применение слова unsigned повышает ранг соответствующего типа со знаком.
3. В операторе присваивания конечный результат вычисления выражения в правой части приводится к типу переменной, которой должно быть присвоено это значение (при этом может быть как повышение так и понижение типа). "Понижение" типа приводит к отбрасыванию разрядов.
4. При вычислениях величин типа float они автоматически преобразуются в тип double (для сохранения точности вычислений, это уменьшает ошибку округления). Конечный результат преобразуется обратно в float, если это диктуется оператором описания.
Операции приведения
|
|
Хотя в СИ и возможно преобразование типов, лучше избегать этого и указывать точно тип данных. Это называется привидением типов.
int num;
num = 1,6+1,7; 3,3 => 3. Сначала числа складываются, затем результат приводится к указанному типу.
num = (int)1,6+(int)1,7; 1+1 = 2. В это случае, числа сначала приведены к данному типу, а затем складываются.
Дополнительные операции присваивания
+ = (величина, стоящая справа, прибавляется к величине, расположенной слева)
n + = 13 тоже, что и n=n+13
- = (от величины, стоящей слева, отнимается величина, расположенная справа)
den - = 20 den = den-20
* = (величина слева умножается на величину справа)
n*=2 n = n*2
/ = делит переменную л.ч. на величину п.ч.
% = дает остаток от деления переменной л.ч. на величину п.ч.
<<=; >>=; | =; & =; ^ =; ~=;