Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Различия префиксных операторов инкремента/декремента в С и C++

Игрался с вот таким кодом на VS:
int a; int b = !!!!!!!!!!!!!!!!!!!!!!!!!!a; int c = ++++++++++++++++++++++++++a; int d = --------------------------a;
И вот что получилось - если компилировать как C - то пишет, что для ++ и -- требуется левостороннее значение. Но если компилировать как C++, то компилирует без ошибок.
Не понимаю, в чем разница, помогите разобраться.


Ответ

В C++ значением префиксных (унарных) оператора ++ и -- является lvalue , в то время как в C это rvalue, то есть временный объект, который нельзя изменить.
Сравните также для примера оператор присвоения. В C++ вы можете написать таким образом
int i; int j = 10;
( i = 5 ) += j;
В C же такой код выполняться не будет так как оператор приисваивания возвращает rvalue
Из стандарта C (6.5.3.1 Prefix increment and decrement operators)
2 The value of the operand of the prefix ++ operator is incremented. The result is the new value of the operand after incrementation. The expression ++E is equivalent to (E+=1). See the discussions of additive operators and compound assignment for information on constraints, types, side effects, and conversions and the effects of operations on pointers.
V (6.5.16 Assignment operators)
3 An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment,111) but is not an lvalue
Из стандарта C++ (5.3.2 Increment and decrement)
1 The operand of prefix ++ is modified by adding 1, or set to true if it is bool (this use is deprecated). The operand shall be a modifiable lvalue. The type of the operand shall be an arithmetic type or a pointer to a completely-defined object type. The result is the updated operand; it is an lvalue, and it is a bit-field if the operand is a bit-field. If x is not of type bool, the expression ++x is equivalent to x+=1 [ Note: See the discussions of addition (5.7) and assignment operators (5.17) for information on conversions. —end note ]
Что касается оператора логического отрицания, то оно применяется к выражениям и эквивалентно выражению e == 0
Из стандарта C (6.5.3.3 Unary arithmetic operators)
9 The operand of the logical negation operator ! is contextually converted to bool (Clause 4); its value is true if the converted operand is false and false otherwise. The type of the result is bool.
И из стандарта C++ (5.3.1 Unary operators)
9 The operand of the logical negation operator ! is contextually converted to bool (Clause 4); its value is true if the converted operand is false and false otherwise. The type of the result is bool.
В программах на C можно нередко встретить двойное отрицание, примененное к выражению
!!expression
Это делается для того, чтобы результат выражения был равен в точности 0 или 1

Комментариев нет:

Отправить комментарий