Может ли функция когда-либо находиться слева от оператора присваивания? - PullRequest
0 голосов
/ 06 декабря 2018

Я не знаю, какой это может быть вариант использования.Мне было просто интересно, появится ли когда-нибудь функция слева от присваивания в C / C ++.Просто в качестве примера, конечно, это неправильно, swap(x,y) = 100;

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

В выражении присваивания языка C левый операнд должен создать объект , в который будет сохранен правый операнд.Это означает, что любое условное выражение , которое разрешается для присваиваемого объекта, подойдет.

Но поскольку в C не существует концепции ссылочного объекта , вы не может напрямую использовать функцию слева от присвоения .Вместо этого это возможно в C ++, где он существует.Т.е. в C ++ вы можете иметь:

int &obj(int pos);
...
obj(0) = 3;

В C вы можете смоделировать предыдущее поведение с помощью небольшой хитрости: заставить вашу функцию возвращать указатель на объект, а затем разыменовывать возвращаемое значение, прежде чем назначить его.Рассмотрим следующий фрагмент:

int *GetPtr(int pos);
...
*GetPtr(0) = 3;

Здесь функция GetPtr() возвращает ссылку на объект, который мы разыменовываем и назначаем.

0 голосов
/ 06 декабря 2018

C 2018 6.5.16 2 говорит:

Оператор присваивания должен иметь модифицируемое lvalue в качестве своего левого операнда.

lvalue - это выражение, которое может обозначатьобъект (например, имя объекта или выражение *p, где * применяется к указателю на объект`).В C выражения вызова функций не являются lvalues.

0 голосов
/ 06 декабря 2018

Как уже упоминалось, вы можете сделать это в C ++, если функция возвращает ссылку, так как ссылка является lvalue.

Вы не можете присвоить напрямую возвращаемому значениюфункции в C, так как она не является lvalue.Однако, если функция возвращает указатель, вы можете разыменовать его.Это даст вам lvalue и , затем , которые вы можете присвоить ему.

int x;

int *getx()
{
    return &x;
}

int main()
{
    printf("x=%d\n", x);    // prints 0
    *getx() = 4;
    printf("x=%d\n", x);    // prints 4
}
0 голосов
/ 06 декабря 2018

Кажется, что вы можете сделать это, используя ссылки.В C ++, то есть нет ссылок в C.

#include <iostream>

int a = 0;

int& swap(int x, int y) {
    return a;
}

int main()
{
    int x = 0, y = 0;
    swap(x, y) = 100;
    std::cout << "a is " << a << std::endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...