Грешка: изразът трябва да бъде модифицируема lvalue (tal * tal)

Ето го проблема ми:

#include "stdafx.h"

int kvad(int tal) {
    int sum;
    tal * tal = sum; /* The left "tal" has the error: Expression must be a modifiable lvalue*/
    return sum;
}

int kub(int alt) {
    int pro;
    alt * alt * alt = pro; /* The left "alt" has the error: Expression must be a modifiable lvalue*/
    return pro;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int ggr, gda, tre, tva;
    printf("Hur många tal att multiplicera: ");
    scanf_s("%d", ggr);
    printf("\n i   i * i   i * i * i\n=== ======= ===========\n");
    for (gda = 1; gda <= ggr; gda++) {
        tva = kvad(gda);
        tre = kub(gda);
        printf("%2d%6d%10d\n", gda, tva, tre);
    }
    return 0;
}

Не знам дали последната част е необходима, но не съм сигурен, така че все пак я включих.

Знам, че има други теми с подобни проблеми, но не мога да намеря решението там.


person Qlewr    schedule 26.08.2014    source източник
comment
Какво очаквахте tal * tal = sum; да направи?   -  person Keith Thompson    schedule 26.08.2014
comment
Очаквах да изведа произведението на число, умножено по себе си.   -  person Qlewr    schedule 26.08.2014
comment
Присвояването не произвежда изход, то съхранява стойност в променлива. Очаквахте ли резултатът от tal * tal да бъде съхранен в sum?   -  person Keith Thompson    schedule 26.08.2014


Отговори (2)


lvalue е стойност, която може да бъде присвоена, и ако често е променлива. За разлика от това, rvalue е стойност, която не може да бъде присвоена. Имената идват от тенденцията, че lvalues са склонни да се появяват от лявата страна на задание, докато rvalues са склонни да се показват от дясната страна на задание. Във вашия код имате:

tal * tal = sum;

Което е грешка, защото tal * tal дава стойност, която не може да бъде присвоена. Изразът води до число, но това е различно от променлива, защото няма смисъл да присвоявате число на друго число. Би било все едно да кажете 5 = variable.

Също така не забравяйте, че присвояването не е комутативно. Тоест tal * tal = sum не е еквивалентно на sum = tal * tal. Името отляво на = е това, което ще бъде присвоена стойността отдясно, така че името отляво винаги трябва да е нещо, което може да бъде присвоено, тоест lvalue.

person jackarms    schedule 26.08.2014
comment
Това са често използвани дефиниции на lvalue и rvalue. Може да се отбележи, че C стандартът използва различни дефиниции: Това, което тук се нарича rvalue, се нарича стойност на израз в стандарта; и (C11 6.3.2) lvalue е израз с тип обект или непълен тип, различен от void, който, например, също покрива идентификатори на масиви, въпреки че те не могат да бъдат от лявата страна на присвояване (те не са 't променливи стойности в условията на стандарта). - person mafso; 26.08.2014
comment
@mafso: Всъщност дефиницията C11 на lvalue е израз (с тип обект, различен от void), който потенциално обозначава обект. Значението на потенциално обозначаващите е малко неясно; идеята е, че *ptr е lvalue независимо от текущата стойност на ptr. Формулировката, която потенциално обозначава обект, беше добавена в C11. Всички 3 стандарта ISO C (1990, 1999 и 2011) имат леко различни дефиниции на lvalue; известно е, че е трудно да се оправиш. - person Keith Thompson; 26.08.2014
comment
@KeithThompson: Благодаря много, копирах от грешната чернова, грешното цитиране определено не трябва да се случва. Btw, знаете ли причините за промяната? - person mafso; 26.08.2014
comment
@mafso: Както се случва, да, аз го правя. Дефиницията C99 (която се опита да коригира проблем с дефиницията C90) беше lvalue е израз с тип обект или непълен тип, различен от void< /b>; ако lvalue не обозначава обект, когато се оценява, поведението е недефинирано. Разбрано буквално, това би означавало, че 42 е стойност и че оценяването на 42 причинява недефинирано поведение - очевидно не е намерението. - person Keith Thompson; 26.08.2014
comment
C90 беше казал, че lvalue е израз ... който обозначава обект, което предполага, че *ptr е стойност, ако и само ако ptr е валидно и ненулево. Дефиницията C99 се опита да поправи това, но по невнимание отпадна изискването да обозначава обект (което е целият смисъл на концепцията. Промяната в C11 беше направена в отговор на предложение, направено от мен в дискусионната група comp.std.c .(Не съм напълно доволен от неяснотата на потенциалните обозначения; подозирам, че lvalue може да се дефинира почти изцяло синтактично.) - person Keith Thompson; 26.08.2014

Трябва да поставите променливата, която получава нова стойност от лявата страна на =

sum = tal * tal;
pro = alt * alt * alt;
person librik    schedule 26.08.2014