2013-08-07 3 views
-7

Вот кодКаким образом это C++ код работы

int& fun(){ 
    static int x = 10; 
    return x; 
} 

int main() { 

    fun() = 30; 

    cout<< fun(); 

    getch(); 
} 

Выход 30. Как это работает?

+2

почему java tag? это смешно? – Juvanis

+0

Вы должны прочитать о ссылках. – Nbr44

+1

Можете ли вы уточнить? С какой частью кода возникают проблемы? – juanchopanza

ответ

10

Давайте читать построчно:

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 (хотя на ваш вопрос уже дан ответ).

6

Он прост: fun возвращает ссылку к static переменной внутри функции, которая присваивается 30 по этой линии:

fun() = 30; 

это означает, x внутри функции изменяется на 30. Что еще? Это 30! Вы печатаете его, вызывая снова fun() в следующей строке.

Обратите внимание, что статическая переменная живет до конца программы: она не уничтожается, даже если функция возвращается!

0

Функция fun возвращает ссылку на тип int. Таким образом, когда вы вызываете fun() = 30, вы фактически устанавливаете x в 30. Таким образом, когда вы распечатываете его, функция fun больше не будет устанавливать его, потому что это одноразовое объявление.

Смежные вопросы