#include <simplecpp>
int &f(int &x, int &y) {
if (x > y) return x;
else return y;
}
main_program{
int p=5, q=4;
f(p,q) = 2;
cout << p << ' ' << q << endl;
cout << f(p, q) << endl;
}
(Это небольшая простая версия C++, используемая для обучения студентов). Чего я не могу понять, так это знака & перед объявлением функции. Что именно он делает?
Те, кто только что одобрил это изменение, не удосужились ли вы прочитать тег wiki для амперсанда?
Более распространенный синтаксис — int&, который более четко указывает, что & (ссылка) применяется к возвращаемому типу.
@user4581301 user4581301 тег амперсанда выглядит как возможность запроса на запись. Я не могу себе представить, какую ценность это принесет.





C++ анализируется на токены предварительной обработки. Любые пробелы между такими токенами не имеют значения.
int — токен (ключевое слово). f, x и y — токены (идентификаторы). &, (, ,, ) и { — токены (операторы/пунктуация).
Итак, все нижеследующее полностью идентично и имеет один и тот же смысл:
int&f(int&x, int&y) {
int &f(int &x, int &y) {
int& f(int& x, int& y) {
int & f(int & x, int & y) {
Я думаю, что третий случай вам, вероятно, знаком больше всего. &, о котором вы спрашиваете, является частью возвращаемого типа, объявляя его «ссылкой на int».
Хотя вы правы, я думаю, вы не ответили прямо на их вопрос. Простой ответ: «функция возвращает ссылку int, а не по значению».
Кажется, я спрашиваю, что делает «&» в программе? То есть если я его удалю, то будет ошибка. Почему?
@KeShAw Он объявляет тип возвращаемого значения «ссылкой на int», а не просто «int». В любом материале, который вы используете для изучения C++, в ссылках должен быть специальный раздел. Объяснить их в комментарии непросто.
Но как «ссылка на что-либо» может хранить здесь значение «2». А также, почему его повторный вызов ведет себя как функция (без ссылки)?
@KeShAw В ваших инструкциях должен быть раздел о ссылках на язык. Бесполезно объяснять их в одном комментарии или ответе. Я предполагал, что вас смущает размещение & непосредственно перед именем функции, а не то, чтобы вы не знали, что это значит в целом.
@user17732522 user17732522 Я знаю использование &. Просто использование его для ссылки на функцию было для меня новым.
@KeShAw & имеет в C++ три совершенно разных значения: 1. побитовый оператор «и», 2. оператор адреса и 3. квалификатор типа, указывающий ссылку (lvalue). Я не уверен, что вы уже знакомы с последним. В любом случае & относится к возвращаемому типу в третьем значении. Это не относится к типу функции. Если вы знаете, что означает int&, то третье переписывание моего ответа должно прояснить смысл.
Символ & перед объявлением функции в C++ указывает, что функция возвращает ссылку. В предоставленном коде:
#include <simplecpp>
int &f(int &x, int &y) {
if (x > y) return x;
else return y;
}
main_program{
int p=5, q=4;
f(p,q) = 2;
cout << p << ' ' << q << endl;
cout << f(p, q) << endl;
}
Здесь int &f(int &x, int &y) означает, что функция f возвращает ссылку на целое число. Параметры int &x и int &y также означают, что x и y передаются в функцию по ссылке.
Цель возврата ссылки из функции — позволить функции вернуть ссылку на одну из переданных ей переменных, чтобы вызывающая сторона могла изменить ее напрямую. Это демонстрируется в следующей строке:
f(p, q) = 2;
В этой строке f(p, q) возвращает ссылку либо на p, либо на q, в зависимости от их значений. Поскольку p больше q (5 > 4), f(p, q) возвращает ссылку на p. Следовательно, f(p, q) = 2; фактически устанавливает p равным 2.
Давайте разберем вывод шаг за шагом:
p — это 5, а q — 4.f(p, q) возвращает ссылку на p (поскольку p > q).f(p, q) = 2; устанавливает p на 2.cout << p << ' ' << q << endl; печатает значения p и q, которые теперь равны 2 4.cout << f(p, q) << endl; снова вызывает f(p, q), и поскольку p (теперь 2) не больше q (4), он возвращает ссылку на q. Таким образом, он печатает значение q, то есть 4.Итак, вывод программы будет:
2 4
4
Использование ссылочного возвращаемого типа позволяет функции предоставлять прямой доступ к переменным, передаваемым в качестве аргументов, позволяя вызывающей стороне изменять эти переменные посредством возвращаемого значения функции.
Кстати,
main_program{не является допустимым синтаксисом, за исключением случаев, когдаmain_programопределен как макрос препроцессора, тем самым скрывая фактический (основной) код C++.