Вот кодКаким образом это C++ код работы
int& fun(){
static int x = 10;
return x;
}
int main() {
fun() = 30;
cout<< fun();
getch();
}
Выход 30. Как это работает?
Вот кодКаким образом это C++ код работы
int& fun(){
static int x = 10;
return x;
}
int main() {
fun() = 30;
cout<< fun();
getch();
}
Выход 30. Как это работает?
Давайте читать построчно:
int& fun()
объявляет функцию с именем fun
, который возвращает ссылку на целое число переменной
{
static int x = 10;
Переменная x
статична внутри этой функции. Особое место в памяти зарезервировано для него и инициализируется 10
. Каждый раз, когда эта функция называется x
, она получает значение, хранящееся в этом специальном местоположении.
return x;
}
Мы возвращаем x
и оставляем функцию. Давайте к main
один:
int main()
{
fun() = 30;
Помните, что fun
возвращает ссылку на междунар. Здесь мы модифицируем целое число, равное 30
. Поскольку это целое число имеет static
распределение каждый раз, когда fun
будет вызываться отныне x
начнется с 30
, если не будут сделаны другие изменения.
cout<< fun();
Поскольку x
является 30
это то, что вы получите.
getch();
}
Предложения: использовать GDB и проследить шаг за выполнение программы шага:
$ gdb ./a.out
(gdb) b main
Breakpoint 1 at 0x40077b: file 1.cpp, line 11.
(gdb) r
Starting program: /tmp/a.out
Breakpoint 1, main() at 1.cpp:11
11 fun() = 30;
Мы начинаем GDB, установите контрольную точку в начале из main
и запустить программу.
(gdb) disp fun()
1: fun() = (int &) @0x60104c: 10
С fun
возвращает ссылку на статической переменной можно отобразить его значение на каждом шаге в GDB.
(gdb) s
fun() at 1.cpp:6
6 return x;
1: fun() = (int &) @0x60104c: 10
Запуск одного шага мы видим, что мы находимся в func
. Это место, где возвращается x
(в качестве справки), которое должно быть отнесено 30
.
(gdb) n
7 }
1: fun() = (int &) @0x60104c: 30
Действительно, после выхода из функции, x
является 30
.
(gdb)
main() at 1.cpp:13
13 cout<< fun();
1: fun() = (int &) @0x60104c: 30
(gdb) s
fun() at 1.cpp:6
6 return x;
1: fun() = (int &) @0x60104c: 30
(gdb)
7 }
1: fun() = (int &) @0x60104c: 30
(gdb)
main() at 1.cpp:15
15 }
1: fun() = (int &) @0x60104c: 30
(gdb) q
Мы продолжаем выполнение программы и оставляем GDB (хотя на ваш вопрос уже дан ответ).
Он прост: fun
возвращает ссылку к static
переменной внутри функции, которая присваивается 30
по этой линии:
fun() = 30;
это означает, x
внутри функции изменяется на 30
. Что еще? Это 30! Вы печатаете его, вызывая снова fun()
в следующей строке.
Обратите внимание, что статическая переменная живет до конца программы: она не уничтожается, даже если функция возвращается!
Функция fun
возвращает ссылку на тип int
. Таким образом, когда вы вызываете fun() = 30
, вы фактически устанавливаете x
в 30. Таким образом, когда вы распечатываете его, функция fun
больше не будет устанавливать его, потому что это одноразовое объявление.
почему java tag? это смешно? – Juvanis
Вы должны прочитать о ссылках. – Nbr44
Можете ли вы уточнить? С какой частью кода возникают проблемы? – juanchopanza