ReadingLab / Discussion-for-Cpp

C++ 中文讨论区
MIT License
89 stars 63 forks source link

问个初级的问题:下面的例子里传值参数与传引用参数的区别? #32

Closed Themnao closed 9 years ago

Themnao commented 9 years ago
  #include <iostream> 
  using namespace std;
  void a(int);
  void b(int&);

  int main()
  {
  int s = 0, t = 10;
  a(s);
  cout << s << endl;
  b(t);
  cout << t << endl;
  return 0;
  }
 void a(int i)
 {
 ++i;
 cout << i << endl;
 }
void b(int& j)
{
++j;
cout << j << endl;
}

运行结果是: 1 0 11 11 我以为的结果是 1 0 11 0 谁能解释运行结果的意思? 不是很懂啊

pezy commented 9 years ago

如果是你以为的结果,那么传值和传引用的差别在哪呢?

Themnao commented 9 years ago

我不太理解执行顺序? 我理解的顺寻是: 第一次执行: int s = 0 void a(int 0) { ++i; cout << i 显示为 1 << endl; } 结果是 1 int s = 0 void b(int& 0) { ++j; cout << j 显示为 0 << endl; } 结果是 0

                 int t = 10
                void a(int 10)
                {
                  ++ i;
                  cout << i 显示为 11 << endl;
                 }
                结果是11
                int t = 10;
                void b(int& 10)
                {
                   ++j;
                   cout << j 显示为11 << endl;
                 }
                结果是11

书上说:void f(T) 的形参采用的是传值方式,也就是说,实参的值被拷贝给形参,形参和实参是两个相互独立的变量,在函数f内部对形参所做的任何改动都不会影响实参的值。 void f(T&)的形参采用的是传引用方式,此时形参是对应的实参的别名,形参绑定到初始化它的对象。如果我们改变了形参的值,也就是改变了对应实参的值。

pezy commented 9 years ago

int s = 0 void b(int& 0) { ++j; cout << j 显示为 0 << endl; } 结果是 0

除了这部分分析的让人不解,其余的分析的都对。书上也把区别说的很清楚了。

按你的分析,最后的输出也是 11,而不是 0 呀。

Themnao commented 9 years ago

能说下你理解的顺序吗?

pezy commented 9 years ago
#include <iostream>

using std::cout; using std::endl;

void a(int i)
{
    ++i; // 0 自加为 1
    cout << i << endl; // 输出 1
}

void b(int &j)
{
    ++j; // 这里对 j 的自加, 就是对 t 的自加, 引用就是个别名而已. t 为 11
    cout << j << endl; // 输出 t 的值为 11.
}

int main()
{
    int s = 0, t = 10;
    a(s); // 传值, s 还是 s, 进入 a 的是 s_copy, 值为 0.
    cout << s << endl; // s 还是 0, 输出 0
    b(t); // 传引用, t 是 10, 进入 b.
    cout << t << endl; // 输出 t, 已经成了 11.
}

// 输出:
// 1 (s_copy)
// 0 (s)
// 11 (t)
// 11 (t)
Themnao commented 9 years ago

谢谢,这下理解第二行输出为0的意思了。