Игрался с вот таким кодом на 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
Комментариев нет:
Отправить комментарий