2016-03-13 3 views
0
void addOne(int &y) 
{ 
    y = y + 1; 
} 

int main() 
{ 
    int x = 5; 
    std::cout << "x = " << x << '\n'; 
    addOne(x); 
    std::cout << "x = " << x << '\n'; 
    return 0; 
} 

Извините, если это основной вопрос. Но почему y = y + 1 равно 6?Почему второй выход 6?

+0

Возможно, вы захотите получить [приличную книгу на C++] (http://stackoverflow.com/q/388242/253056) и прочитать главу о * ссылках *. –

+0

Вот что я сделал. Но я действительно не получаю эту часть в заметках. Вот почему мне нужно больше людей, чтобы помочь мне здесь, чтобы лучше понять. .. – Student

+0

'addOne' просто добавляет 1 к любой переменной' int', которую вы передаете ей (* по ссылке *). Таким образом, в этом случае вы передаете 'x', который имеет значение 5, и он добавляет к нему 1, чтобы стать 6. –

ответ

2

Что может помочь, на начальном этапе, это думать о ссылок, как синтаксический сахар для указателей.

Рассмотрим следующий пример:

int main() { 
    int x = 5; 
    int *px = &x; 
    *px = 8; 

    cout << x << endl; 

    return 0; 
} 

Это печатает 8, как и следовало ожидать. (Если вы не ожидали, что тогда, возможно, стоит прочитать introduction to pointers перед рассмотрением ссылок.)

Эта ссылочная переменная может рассматриваться как переменная-указатель, синтаксис которой является регулярной переменной. Далее эквивалентно предыдущему примеру:

int main() { 
    int x = 5; 
    int &rx = x; 
    rx = 8; 

    cout << x << endl; 

    return 0; 
} 

То есть, rx становится ссылка наx, и, таким образом, каждый раз, когда вы меняете rx, вы меняете x, а также, потому что оба названия относятся к одной и той же вещи. .. или, другими словами, rx связан с адресом в памяти , не значение, и установки rx изменяет то, что в этом месте памяти.

В некотором смысле rx является своего рода невидимым - это не имеет существование своей собственной, она существует только в плане того, что x является (именно поэтому вы должны инициализировать ссылку, когда он объявил, то есть вы не может сделать int &rx; в функции и оставить его висит).

Так что, когда у вас есть:

void addOne(int &y) 
{ 
    y = y + 1; 
} 

Это функция параметр, является ссылка на то, что передается в ... и поэтому, когда опорный параметр изменяется, то, что ссылка относится к также изменяется.

И поэтому, когда вы называете это так:

int main() 
{ 
    int x = 5; 
    std::cout << "x = " << x << '\n'; 
    addOne(x); 
    std::cout << "x = " << x << '\n'; 
    return 0; 
} 

Это вызывает addOne с x, таким образом инициализирует int & ссылку y на x, и поэтому, когда y изменяется, x меняется ... и так x изменяется от 5 до 5 + 1, то есть 6.

Вы можете думать об этом как эквивалентно следующему:

void addOne(int *py) 
{ 
    *py = *py + 1; 
} 

int main() 
{ 
    int x = 5; 
    std::cout << "x = " << x << '\n'; 
    addOne(&x); 
    std::cout << "x = " << x << '\n'; 
    return 0; 
} 

Чтобы понять, почему вы хотите использовать ссылку против указателя см this question.

1

Ссылка не является независимой переменной, вы должны считать ее буквально быть другой. Поэтому, когда вы передаете x для функции addOne, ссылка, называемая y, буквально становится x (как это работает за экранами, сейчас не так важно).

Поэтому, когда вы увеличиваете y на единицу, то, что вы действительно делаете, увеличивается x. Вот почему x равно 6, после вызова addOne.

+0

Когда передано 5, уравнение будет равно 5 = 5 + 1? Или я ошибаюсь? – Student

+0

Вы не занимаетесь математикой, вы программируете. В этом выражении вы говорите машине, чтобы она приняла _variable_, которая в настоящее время содержит значение 5, добавляет 1 и сохраняет результат обратно в одну и ту же переменную. Тот факт, что некоторые обозначения разделяются с математическими выражениями, не превращает компьютерный язык в прямое выражение тех же понятий, которые у вас есть в математике, и вы не должны интерпретировать его таким же образом вообще. –

+0

Вижу. Итак, компьютер будет игнорировать значение 5, переданное самой переменной? – Student

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