Ошибка: выражение должно быть модифицируемым 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 — это значение, которому нельзя присвоить значение. Имена происходят из-за того, что lvalue обычно появляются в левой части задания, тогда как rvalue чаще появляются в правой части задания. В вашем коде у вас есть:

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 модифицируемые lvalues в терминах стандарта). - person mafso; 26.08.2014
comment
@mafso: На самом деле определение lvalue в C11 представляет собой выражение (с типом объекта, отличным от void), которое потенциально обозначает объект. Значение потенциально обозначает немного расплывчато; идея состоит в том, что *ptr является lvalue независимо от текущего значения ptr. В C11 была добавлена ​​формулировка, которая потенциально обозначает объект. Все 3 стандарта ISO C (1990, 1999 и 2011) имеют немного разные определения lvalue; это общеизвестно трудно получить право. - person Keith Thompson; 26.08.2014
comment
@KeithThompson: Большое спасибо, я скопировал не тот черновик, неправильное цитирование определенно не должно происходить. Кстати, вы знаете причины изменения? - person mafso; 26.08.2014
comment
@mafso: Как это бывает, да, знаю. Определение C99 (которое пыталось исправить проблему с определением C90): lvalue — это выражение с типом объекта или неполным типом, отличным от void< /б>; если 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