2016-08-16 4 views
1

У меня есть программа приведенной нижеПросьба уточнить понятие Левое и правое здесь

#include<stdio.h> 
int main() 
{ 
    int i=5; 
    (++(++i)); 
} 

Эта программа отлично компилируется в C++, но не в с. Я тоже не мог понять. Но я пробовал читать и искать и обнаружил, что это потому, что оператор preincrement возвращает rvalue в c и lvalue в C++.

Если я меняю (++(++i)) на (++(i++)), то компиляция завершится с ошибкой как в c, так и в C++, потому что пост-инкремент всегда возвращает rvalue.

Даже после некоторого чтения я не вижу четкого представления о том, что именно означает значение lvalue и rvalue. Может кто-нибудь объяснить мне в непрофессиональных терминах, что это такое?

+1

'lvalue' - это то, что можно назначить. 'rvalue' - это то, что можно назначить. –

+1

Не уверен, что это слишком широкий, чтобы быть дубликатом, но вы можете найти ответ здесь: http://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues ​​ – juanchopanza

+0

Чтобы взять 'int i = 5;' в качестве примера: 'i' является lvalue, потому что он может стоять слева от' = '. 5 не является lvalue, поэтому вы не можете писать '5 = i;' (и есть prvalue, xvalues ​​и т. Д.) – deviantfan

ответ

3

В C постфикса или префикса ++ операторы требуют, чтобы операнд является изменяемым-значение. Оба оператора выполняют преобразование lvalue, поэтому объект больше не является lvalue.

C++ также требует, чтобы операнд префикса ++ был модифицируемым значением lvalue, но результатом префикса ++ является lvalue. Это не относится к оператору postfix ++.

Поэтому (++(++i)); компилируется, поскольку вторая операция получает значение lvalue, но (++(i++)) нет.

1

Rvalues ​​- это по существу исходные значения или временные результаты операции, их нельзя эксплуатировать. Таким образом, операции до или после инкремента по ним не допускаются.

Lvalues ​​являются традиционными значениями, которые относятся к сохраненному объекту, функции или примитиву, вещам, которые могут быть использованы или вызваны.

В вашей первой строке: int i=5; // i is an lvalue, 5 is an rvalue

Итак, ++(i++) переводит в ++6, который, по существу, что компилятор жалуется.

Btw, это уже отвечал здесь: What are rvalues, lvalues, xvalues, glvalues, and prvalues?

2

«Именующее выражение (значение локатор) представляет собой объект, который занимает некоторое идентифицирующую местоположение в памяти (т.е. имеет адрес)

rvalues ​​определены. путем исключения, говоря, что каждое выражение является либо значением lvalue, либо rvalue. Поэтому из приведенного выше определения lvalue rvalue является выражением, которое не представляет объект, занимающий некоторое идентифицируемое местоположение в памяти ».

ссылка: http://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c

Исходя из этого определения, пост-инкремент i++ больше не будет работать, потому что выражение возвращается не находится в i больше, так как она увеличивается.

В то же время выражение, возвращаемое ++i возвращает ссылку на приращение переменной i

0
"lvalue" and "rvalue" are so named because of where each 
    of them can appear in an assignment operation. An 
    lvalue 
can appear on the left side of an assignment operator, 
    whereas an rvalue can appear on the right side. 

    As an example: 

int a; 
a = 3; 

In the second line, "a" is the lvalue, and "3" is the rvalue. 

in this example: 



int a, b; 
a = 4; 
b = a; 

In the third line of that example, "b" is the lvalue, and "a" is 
the rvalue, whereas it was the lvalue in line 2. This 
illustrates an important point: An lvalue can also be an 
rvalue, but an rvalue can never be an lvalue. 

Another definition of lvalue is "a place where a value can 
be stored." 
Смежные вопросы