Операторы префиксных (++х, --х) и постфиксных (х++, х--) инкремента/декремента влияют на свои операнды. Они различаются между собой моментом выполнения инкремента/декремента при вычислении выражения. В префиксной форме (++х, --х) инкремент/декремент выполняется до использования значения при вычислении выражения, поэтому значение выражения отличается от значения операнда. В постфиксной форме (х++, х--) инкремент/декремент выполняется после использования значения при вычислении выражения, поэтому значение выражения совпадает со значением операнда.
Оператор префиксного инкремента (++) /декремента (––) добавляет/вычитает единицу к операнду, который должен иметь l - value значение типа, отличного от const; результатом выражения является это инкрементированное/ декрементированное l - value значение того же типа, как у операнда.
В результате применения постфиксного оператора инкремента (++)/ декремента (––) значение операнда увеличивается/уменьшается на одну единицу соответствующего типа, но значение выражения вычисляется до применения соответствующего оператора, а операция инкремента/декремента выполняется после вычисления операнда. Эта особенность возникает, только когда постфиксная операция инкремента/декремента выполняется в контексте выражения. Операнды для постфиксных операторов декремента должны иметь изменяемые (без модификатора const) l - value начения арифметического или указательного типа. Результат имеет такой же тип, как и постфиксное-выражение.
Если постфиксный оператор применяется к аргументу функции, то инкремент/декремент значения аргумента необязательно будет выполнен до его передачи в функцию.
Операнд типа указателя инкрементируется или декрементируется на значение размера объекта, к которому он относится. Инкрементированный указатель указывает на следующий объект, а декрементированный — на предыдущий.
| тип операции | операция | содержание | примеры |
| префиксная | ++x | увеличение значения операнда на 1 до использования его значения | a=1; q = 2* ++a; àa=2; q=4 |
| --x | уменьшение значения операнда на 1 до использования его значения | a=1; q = 2* --a; à a=0; q=0 | |
| постфиксная | x++ | увеличение значения операнда на 1 после использования его значения | a=1; q= 2*a++; à q=2; a=2; |
| x-- | уменьшение значения операнда на 1 после использования его значения | a=1; q= 2*a--; à q=2; a=0 |
Правило:
- при самостоятельном использовании префиксная и постфиксная операции выполняются одинаково, т.е. не важно, где стоит знак операции (++k, k++);
- в выражениях префиксная и постфиксная операции различаются:
в случае префиксной операции сначала изменяется значение переменной, перед которой стоит операция, а затем используется новое измененное значение;
в случае постфиксной операции сначала используется старое значение переменной, после которой стоит операция, затем оно изменяется;
- не применять ++ и -- к переменной, присутствующей более чем в одном аргументе функции (например, printf (“……..”, a, a * a++);).
- не применять ++ и -- к переменной, которая входит в выражение более одного раза (например, k = a / 2 + 5 * (1 + a++);).
- операнд не может быть константой, применять операцию только к переменным.
- операндом может быть только l - value -выражение ( ++(j + k) – неверная запись).
-----------------------------------------------------------------------------------------
Операции равенства
Действие операций соответствует их математическому пониманию. Результатом операций является логическое значение true или false. Операции используются при формировании условий в условных операторах и циклах. Операции имеют одинаковый приоритет, более низкий, чем арифметические операции и операции отношения, и выполняются «слева направо».
| тип | операция | примеры |
| бинарные | ==!= | a != b == c à (a!= b) == c 1 2 |
!!! Ошибочное употребление символа присваивания = вместо знака операции равно == приводит к семантическим ошибкам.
!!! Обратите внимание, что если int i=44, а int j=24, то запись (i==j) дает значение false, а (i=j) дает значение true. Объясните, почему.
Сравнение на равенство вещественных чисел имеет свои особенности.
Примеры сравнения вещественных чисел на равенство:
int main()
{
float x = 1;
x += 0.5; // значение x 1.5 имеет тип float
bool b = (x == 1.5); //константа 1.5 имеет тип double
// значение x и константа 1.5 представляются в 2 с/с точно, поэтому
cout << b << endl; // 1 (true)!!!
_getch();
return 0;
}
int main()
{
float x = 1;
x += 0.1; // значение x 1.1 имеет тип float
bool b = (x == 1.1); //константа 1.1 имеет тип double
// значение x и константа 1.1 представляются в 2 с/с бесконечным
// числом, поэтому
cout << b << endl; // 0 ( false )!!!
_getch();
return 0;
}
НО!!!
int main()
{
double x = 1;
x += 0.1; // значение x = 1.1 имеет тип double
bool b = (x == 1.1); //константа 1.1 имеет тип double
// значения x и 1.1 представлены в 2 с/с числами одинаковой длины
cout << b << endl; // 1 ( true )!!!
_getch();
return 0;
}
int main()
{
float x = 1;
double z = 1.1;
x += 0.1; // значение x==1.1 имеет тип float
bool b =(x == z); //z имеет тип double
// значения x и z представлены в 2 с/с числами разной длины
cout << b << endl; // 0 ( false )!!!
_getch();
return 0;
}
Поэтому правильно надо записывать так:


-----------------------------------------------------------------------------------------






