Страницы

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

суббота, 30 ноября 2019 г.

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

#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.

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

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