Почему назначение указателя показывает ошибку lvalue, когда назначения выглядят уместно? - PullRequest
2 голосов
/ 15 апреля 2019

Мне дан фрагмент кода, для которого мы должны угадать вывод.

Мой вывод: 60

#include <stdio.h>

int main()
{
    int d[] = {20,30,40,50,60};
    int *u,k;
    u = d;
    k = *((++u)++);
    k += k;
    (++u) += k;

    printf("%d",*(++u));

    return 0;
}

Ожидаемое: k = *((++u)++) будет равно 30, поскольку он будет повторяться один раз (++ u), а затем будет повторяться, но не назначаться. Итак, мы в д [1].

(++u) += k здесь вы перебираете следующую позицию, добавляете к ней k и затем присваиваете результат следующему элементу u.

Фактический результат:

main.c: In function ‘main’:
main.c:16:16: error: lvalue required as increment operand
     k = *((++u)++);
                ^
main.c:18:11: error: lvalue required as left operand of assignment
     (++u) += k;

И это еще больше смутило меня в понятиях указателей. Пожалуйста, помогите.

Ответы [ 2 ]

8 голосов
/ 15 апреля 2019

Как сказал вам компилятор, программа недействительна C.

В C предварительное увеличение приводит к rvalue выражению , которое вы не можете назначать или увеличивать.

Это не логическая проблема; это проблема языка. Вы должны разбить эту сложную формулу на несколько операторов кода.

Это все, что нужно.

(В C ++ это lvalue , и вы можете делать обе эти вещи.)

6 голосов
/ 15 апреля 2019

В С ++a равно , а не значение l.

Неофициально это означает, что вы не можете иметь его в левой части задания.

Это также означает, что вы не можете увеличить его.

То есть (++a)++ неверный код.

(обратите внимание, что это действительно C ++).

...