#cpp #c
Игрался с вот таким кодом на VS: int a; int b = !!!!!!!!!!!!!!!!!!!!!!!!!!a; int c = ++++++++++++++++++++++++++a; int d = --------------------------a; И вот что получилось - если компилировать как C - то пишет, что для ++ и -- требуется левостороннее значение. Но если компилировать как C++, то компилирует без ошибок. Не понимаю, в чем разница, помогите разобраться.
Ответы
Ответ 1
В 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.
Комментариев нет:
Отправить комментарий