почему lvalue требуется как ошибка операнда приращения?

Почему lvalue требуется в качестве операнда приращения Error In a=b+(++c++);?

Просто хотел присвоить "b+(c+1)" значению "a" и одновременно увеличить "C" на 2.

Я новичок, просто хотел получить разъяснения о том, что такое "LVALUE ERROR" на самом деле?

main()
{

int a=1,b=5,c=3;

a=b+(++c++);  

printf("a=%d   b= %d   c= %d \n",a,b,c);
}

person Neeraj Raghavendra    schedule 11.10.2012    source источник
comment
Эээ... что именно вы пытаетесь сделать? Кажется, вы хотите увеличить c на два, но я не думаю, что это сработает. Вы ЛИБО делаете преинкремент, ИЛИ постинкремент. Но я никогда не видел (и даже не думал об использовании) обоих. Я предполагаю, что он просто не знает, что делать с этим кодом.   -  person ATaylor    schedule 11.10.2012
comment
Я просто хотел назначить «b + (c + 1)» на «a» и одновременно увеличить «C» на 2.   -  person Neeraj Raghavendra    schedule 11.10.2012
comment
@leppie - хотя поведение такого кода не определено, сам вопрос касается не неопределенного поведения, а lvalues.   -  person mouviciel    schedule 11.10.2012
comment
Новичкам никогда не следует писать такой код, а экспертам лучше знать, что такой нелепый код лучше не писать. Даже если бы это могло сработать, как вы думаете, в чем было бы преимущество? Даже если бы это сработало, оно бы попало под слишком умно.   -  person Clifford    schedule 13.10.2012


Ответы (2)


Приращение постфикса связывается сильнее, чем приращение префикса, поэтому вам нужно что-то вроде:

a = b + (++c)++;

Однако это недопустимо в C, поскольку результат приращения префикса (как результат приращения постфикса в вашем примере) не является lvalue. Это означает, что это просто значение; он больше не относится к конкретному объекту, такому как 'c', поэтому попытки изменить его не имеют смысла. Это не будет иметь видимого эффекта, поскольку ни один объект не будет обновлен.

Лично я думаю, что делать это в двух утверждениях в любом случае понятнее.

a = b + c + 1;
c += 2;
person CB Bailey    schedule 11.10.2012

LVALUE означает, что нет переменной, над которой должна выполняться операция.

Файлы C в основном не что иное, как текстовые файлы, которые требуют определенного форматирования, чтобы компилятор мог его понять.

Написание чего-то вроде ++Variable++ — полная ерунда для компилятора.

В основном вы можете представить ++c как:

Var += 1;
return Var;

в то время как С++:

int Buf = Var;
Var += 1;
return Buf;

Чтобы «исправить» ваш код:

void main() {
    int a=1,b=5,c=3;
    a = b + (++c);  //Equals 5 + 4
    printf("a=%d   b= %d   c= %d \n",a,b, ++c);  //a = 9, b = 5, c = 5
}

Таким образом, вы получите желаемый результат без жалоб компилятора.

Пожалуйста, помните, что при использовании ++c или c++ в комбинированной операции порядок имеет значение. При использовании ++c в операции будет использоваться большее значение, при использовании c++ — старое значение.

Это означает:

int a, c = 5;
a = 5 + ++c;  //a = 11

пока

int a, c = 5;
a = 5 + c++;  //a = 10

Потому что в последнем случае c будет только «6» ПОСЛЕ того, как оно будет добавлено к 5 и сохранено в a.

person ATaylor    schedule 11.10.2012
comment
Технически ++Variable++ - это не два вызова функций одновременно, это вообще не вызовы функций. Выражение имеет определенную привязку: ++(Variable++), которая недопустима по разным причинам, но не имеет ничего общего с операциями (или функциями), применяемыми (или вызываемыми) одновременно. - person CB Bailey; 11.10.2012
comment
Да, если мы хотим быть технически об этом. Я пытался объяснить, но вы, конечно, правы. Давайте придерживаться: «Компилятор не примет это». - person ATaylor; 11.10.2012