C ++ - передача параметра по ссылке в функцию, которая возвращает int - PullRequest
1 голос
/ 29 февраля 2012

Я создал программу на C ++ для проверки функциональности передачи параметров по ссылкам для функций.

#include <iostream>

using namespace std;

int f(int &b) {
    b = b + 1;
    cout << b << endl;
    return b;
}

int main() {
    int t = 10;

    cout << f(t) << " " << t << endl;
    //cout << f(&t) << " " << t << endl;

    system("PAUSE");

    return 0;
}

Не могли бы вы объяснить, почему эта программа не влияет на значение t после выполнения функции f?Переданный параметр b является ссылкой, поэтому я подумал, что его значение изменится после выполнения программы, потому что я работаю с реальной переменной из основной функции, а не с ее копией.В этом случае, я ожидаю, что это будет 11, но это не влияет на выполнение программы.

Почему это происходит?

Ответы [ 5 ]

5 голосов
/ 29 февраля 2012

Значение t увеличивает . Вы увидите это, если разделите оператор вывода на две части:

cout << f(t) << endl;
cout << t << endl;

С вашим исходным оператором вывода:

cout << f(t) << " " << t << endl;

компилятор может свободно вычислять t до f(t), что приводит к выводу, который вы видите. Для получения дополнительной информации см. cout << порядок вызова функций, которые она печатает? </a>

0 голосов
/ 29 февраля 2012

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

Однако мне нравится немного отвлекаться от вопросов и пытаться понятьо том, как заставить людей понять не только непосредственную проблему, но и почему они испытывают трудности в первую очередь, и здесь мне это совершенно ясно.

Вам необходимо изучить отладчик.

Используя один, вы можете пройтись по своему коду и увидеть значение t в любой заданной точке, а также увидеть, почти без каких-либо усилий с вашей стороны, что оно действительно увеличивается (в том числе точно, когдаи как).Вы также получите гораздо лучшее представление о том, как работает код, отследив его с помощью отладчика, включая такие понятия, как рекурсия.

Я рекомендовал вам немедленно приступить к этому, так как это откроет вам глаза накод на самом деле работает, не угадывая ваш путь через операторы вывода.

0 голосов
/ 29 февраля 2012

Язык не определяет порядок, в котором оцениваются аргументы оператора, поэтому не указано, принимает ли ваше выражение cout значение t до или после вызова функции.

Вы увидите ожидаемый результат, если введете точку последовательности, возможно, разделив ее на два выражения:

cout << f(t) << " ";
cout << t << endl;
0 голосов
/ 29 февраля 2012

Я думаю, вы столкнулись с проблемами, связанными с точками последовательности . Вы изменяете и печатаете значение t в том же выражении.

Порядок, в котором компилятор решает оценить t и когда он решает оценить f(t), не определен. Так что функция просто не может быть вызвана первой, как вы думаете.

Если разбить печать на два оператора, то вы увидите, что t фактически изменилось. Например:

cout << f(t) << " ";
cout << t << endl;

будет иметь ожидаемый результат.

0 голосов
/ 29 февраля 2012

Ваш код имеет неопределенное поведение, потому что он не определен, в какой момент в выражении возникают побочные эффекты.

Это похоже на

cout << i++ << ++i;

В зависимости от компилятора вы можете получить разные результаты.

...