形参与实参的传递

时间:2022-08-29 20:19:27
形参与实参的传递
这个程序里input()不是无返回的函数么,那形参应该不影响实参的,为什么结果是10,,10呢?
形参与实参的传递
为什么这样改的话就又变成5,5了呢?实在搞不明白,虚心求解!

25 个解决方案

#1


形参影不影响实参,不是根据函数有没有返回值来判断的。根据具体的变量作用域来判断。
首先x和y是类point的成员,在类中相当于是全局变量。第一段代码中
void input(int a,int b)
{
    x = a;
    y = b;
}
出了这个大括号范围,因为x和y是在这组大括号之外定义的,所以出了这组大括号依然存在,在类中可以使用,所以输出10和10。
第二段代码中
void input(int x,int y)
{
    x = x;
    y = y;
}
从输出结果来看,说明类的成员变量x和y并没有被赋上值,因为局部变量有最高的优先级,这个函数的=左边的x不是类的成员变量的x,而是void input(int x,int y)里面的x,出了大括号之后失去生命周期。相当于{int x;x=x;}

不知道你明白没有?

#2


计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
但我又不得不承认:
 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物;
 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。
而我本人属前者。

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

十字链表交换任意两个节点C源代码(C指针应用终极挑战) http://download.csdn.net/detail/zhao4zhong1/5532495

#3


这么说吧
void input(int a ,int b)
{
   x = a;
   y = b;
}
定义等价于
void input(int a ,int b)
{
   this.x = a;
   this.y = b;
}
这很正常。但是如果这么定义
void input(int x ,int y)
{
   x = x;
   y = y;
}
等价于
void input(int x ,int y)
{
   this.x = this.x;
   this.y = this.y;
}
这样能看出问题了吧。意思就是说,你定义的函数的形参和成员变量同名的时候,在函数体里引用,就会变成优先有了成员变量,形参没用到。

#4


ls正解,我也学习到了。嘿嘿!

#5


引用 3 楼 hai200501019 的回复:
void input(int x ,int y)
{
   x = x;
   y = y;
}
等价于
void input(int x ,int y)
{
   this.x = this.x;
   this.y = this.y;
}

错了 函数input里面的x 是形参x 不是this->x

#6



函数的实参和形参 和函数的返回值没有关系!


int test_func(int a, int b);//形参a,b

int a =10, b =20;
test_func(a, b); //实参a, b

#7


引用 5 楼 lin5161678 的回复:
Quote: 引用 3 楼 hai200501019 的回复:

void input(int x ,int y)
{
   x = x;
   y = y;
}
等价于
void input(int x ,int y)
{
   this.x = this.x;
   this.y = this.y;
}

错了 函数input里面的x 是形参x 不是this->x

我的意思是,input这么写的话,编译器就这么理解,没有用形参到x,而是直接把成员变量的x和y赋值给自身了,结果自然是5 和5 。不知理解否?

#8


引用 7 楼 hai200501019 的回复:

我的意思是,input这么写的话,编译器就这么理解,没有用形参到x,而是直接把成员变量的x和y赋值给自身了,结果自然是5 和5 。不知理解否?

编译器是就近原则,如果在一个嵌套的作用域里变量和上层变量同名,就会用最里面那层的...
简单来说,你这个例子,除非你指明this->x,不然都是函数里的x,跟成员变量无关

就是x=x,两个都是形参而不是你说的this->x=this->x 不信你改成x=x+1试试,肯定没变化

#9


给你段代码,自己去运行看看就知道了

#include <iostream>
using namespace std;

int x=1;

int main(){
int x=2;
{
int x=3;
{
int x=4;
cout<<x<<endl;
}
cout<<x<<endl;
}
cout<<x<<endl;
cout<<::x<<endl;
getchar();
return 0;
}

#10


引用 7 楼 hai200501019 的回复:
我的意思是,input这么写的话,编译器就这么理解,没有用形参到x,而是直接把成员变量的x和y赋值给自身了,结果自然是5 和5 。不知理解否?
对于input来说 this->x才是外来人口

#11


对于class作用域,成员变量都有this指针,前一种情况,this.x=a;this.y=y,改变了成员变量,当output的时候,cout<<this.x<<" "<<this.y,就是10,10,
后种情况是作用域的问题,局部变量会屏蔽类作用域内的成员变量,因此
void input(int x,int y)
{
    x = x;
    y = y;
}


只是改变局部变量,也就是函数参数的值,并未改变类成员变量的值,因此调用类成员函数,output时候还是5,5

#12


引用 8 楼 Adol1111 的回复:
Quote: 引用 7 楼 hai200501019 的回复:

我的意思是,input这么写的话,编译器就这么理解,没有用形参到x,而是直接把成员变量的x和y赋值给自身了,结果自然是5 和5 。不知理解否?


编译器是就近原则,如果在一个嵌套的作用域里变量和上层变量同名,就会用最里面那层的...
简单来说,你这个例子,除非你指明this->x,不然都是函数里的x,跟成员变量无关

就是x=x,两个都是形参而不是你说的this->x=this->x 不信你改成x=x+1试试,肯定没变化
恩,书上也说了是形参赋给了形参。

#13


引用 1 楼 forever199112 的回复:
形参影不影响实参,不是根据函数有没有返回值来判断的。根据具体的变量作用域来判断。
首先x和y是类point的成员,在类中相当于是全局变量。第一段代码中
void input(int a,int b)
{
    x = a;
    y = b;
}
出了这个大括号范围,因为x和y是在这组大括号之外定义的,所以出了这组大括号依然存在,在类中可以使用,所以输出10和10。
第二段代码中
void input(int x,int y)
{
    x = x;
    y = y;
}
从输出结果来看,说明类的成员变量x和y并没有被赋上值,因为局部变量有最高的优先级,这个函数的=左边的x不是类的成员变量的x,而是void input(int x,int y)里面的x,出了大括号之后失去生命周期。相当于{int x;x=x;}

不知道你明白没有?



那是不是只要是形参和实参是同一名字,函数里的就都是形参之间的运算?

#14


引用 5 楼 lin5161678 的回复:
Quote: 引用 3 楼 hai200501019 的回复:

void input(int x ,int y)
{
   x = x;
   y = y;
}
等价于
void input(int x ,int y)
{
   this.x = this.x;
   this.y = this.y;
}

错了 函数input里面的x 是形参x 不是this->x

----------------------------------------

#include<iostream>
#include<string>
using namespace std;

class point
{
public:
int x,y;
point(int a,int b)

x=a; // 1 处
y=b;
}
void set(int x,int y)
{   //  2处
x=x;
y=y;
}
void get()
{  // 3 处
cout<<x<<endl;
cout<<y<<endl;
}

};

int main()
{
point pt(5,5);
pt.set(10,10);
pt.get();

return 0;

}

------------------------------------------
我单步调试到 2处时(还没有赋值),1处和2处的x y 的值都是由5变成10了;然后调试到3处时(还没有赋值),1处和2处的x y又都由10变成5了,很奇怪啊,到底 2处的 x,y 是指this->x 还是形参int x 啊?好像上面的调试情况都没办法解释啊?求高人解答!!

#15


引用 13 楼 u011829796 的回复:
那是不是只要是形参和实参是同一名字,函数里的就都是形参之间的运算?

跟实参没有任何关系,变量生存有自己的作用域,只要在这个作用域里存在这个名字的变量,就是用这个变量,如果没有就到上一层(嵌套它的外层)去找相应的变量,一层层上去,直到找到对应变量为止,如果不存在编译器就报错

#16


两次都是操作同一个成员 当然改变了  话说这不是参数问题

#17


引用 14 楼 xiangzhihappy 的回复:
------------------------------------------
我单步调试到 2处时(还没有赋值),1处和2处的x y 的值都是由5变成10了;然后调试到3处时(还没有赋值),1处和2处的x y又都由10变成5了,很奇怪啊,到底 2处的 x,y 是指this->x 还是形参int x 啊?好像上面的调试情况都没办法解释啊?求高人解答!!

1处x、y是成员变量的x、y,取了形参a、b的值,所以是5、5
2处用的是形参里的x,y,所以变成了10、10,所以成员变量未发生变化
3处没有形参所以会到外层查找成员变量,所以这里的x、y是this->x就是成员变量,也就是原来的5、5

#18


还有你单步的时候没有看this->x吧,2处成员没变化啊,你在2处看x、y,当然只有2处的x、y值了。
如果不加this进入函数里,而这个作用域里有相同名字的变量,就会变成对应的变量的值,而不是1处成员的值,这点要分清楚啊。

#19


引用 17 楼 Adol1111 的回复:
Quote: 引用 14 楼 xiangzhihappy 的回复:

------------------------------------------
我单步调试到 2处时(还没有赋值),1处和2处的x y 的值都是由5变成10了;然后调试到3处时(还没有赋值),1处和2处的x y又都由10变成5了,很奇怪啊,到底 2处的 x,y 是指this->x 还是形参int x 啊?好像上面的调试情况都没办法解释啊?求高人解答!!

1处x、y是成员变量的x、y,取了形参a、b的值,所以是5、5
2处用的是形参里的x,y,所以变成了10、10,所以成员变量未发生变化
3处没有形参所以会到外层查找成员变量,所以这里的x、y是this->x就是成员变量,也就是原来的5、5


----------------------------
我的意思是2处如果用的是形参的里的x,y,为什么还没有到赋值的时候1处的x,y也变成10了,1处的x,y可是成员变量啊,可不会随着2处的形参x,y的值变化啊? 还请指教。

#20


引用 16 楼 modyaj 的回复:
两次都是操作同一个成员 当然改变了  话说这不是参数问题

如果是同一个成员,那为什么调试到3处的时候,x,y又从10变回到5啊?

#21


引用 19 楼 xiangzhihappy 的回复:
----------------------------
我的意思是2处如果用的是形参的里的x,y,为什么还没有到赋值的时候1处的x,y也变成10了,1处的x,y可是成员变量啊,可不会随着2处的形参x,y的值变化啊? 还请指教。

你在2处的时候,怎么查看1处的变量??1处的x、y是成员,虽然能查看,但是查看的时候必须加this->,因为你2处的形参和成员是同名的。你在2处,如果直接用x、y查看,不论哪一个x、y都是形参的x、y,所以你看到的x、y都变成了10、10.当然如果你的形参不是x、y是其他名字,而且函数里也没有x、y,那么此时你直接用x、y查看是没有问题的。

你在3处的时候用x、y查看可以,是因为你函数里没有x,y,也没有x、y的形参,所以此时的x、y就是成员。

#22


形参与实参的传递

#23


引用 21 楼 Adol1111 的回复:
Quote: 引用 19 楼 xiangzhihappy 的回复:

----------------------------
我的意思是2处如果用的是形参的里的x,y,为什么还没有到赋值的时候1处的x,y也变成10了,1处的x,y可是成员变量啊,可不会随着2处的形参x,y的值变化啊? 还请指教。

你在2处的时候,怎么查看1处的变量??1处的x、y是成员,虽然能查看,但是查看的时候必须加this->,因为你2处的形参和成员是同名的。你在2处,如果直接用x、y查看,不论哪一个x、y都是形参的x、y,所以你看到的x、y都变成了10、10.当然如果你的形参不是x、y是其他名字,而且函数里也没有x、y,那么此时你直接用x、y查看是没有问题的。

你在3处的时候用x、y查看可以,是因为你函数里没有x,y,也没有x、y的形参,所以此时的x、y就是成员。

谢谢啊! 是我调试的时候查看弄错了,现在明白了,谢谢详解!

#24


引用 15 楼 Adol1111 的回复:
Quote: 引用 13 楼 u011829796 的回复:

那是不是只要是形参和实参是同一名字,函数里的就都是形参之间的运算?

跟实参没有任何关系,变量生存有自己的作用域,只要在这个作用域里存在这个名字的变量,就是用这个变量,如果没有就到上一层(嵌套它的外层)去找相应的变量,一层层上去,直到找到对应变量为止,如果不存在编译器就报错

恩,明白了,十分感谢!

#25


引用 20 楼 xiangzhihappy 的回复:
Quote: 引用 16 楼 modyaj 的回复:

两次都是操作同一个成员 当然改变了  话说这不是参数问题

如果是同一个成员,那为什么调试到3处的时候,x,y又从10变回到5啊?

对于
void input(int x, int y)
{
x = x;
y = y;
}
调用时候赋值给x,这个x就是int x 的x,对于x = x; 左右参数都是int x 的 x,和pt.x没有关系,也就是这种情况下,还没有到this.x = x的这步,函数就结束了,y 也同理

#1


形参影不影响实参,不是根据函数有没有返回值来判断的。根据具体的变量作用域来判断。
首先x和y是类point的成员,在类中相当于是全局变量。第一段代码中
void input(int a,int b)
{
    x = a;
    y = b;
}
出了这个大括号范围,因为x和y是在这组大括号之外定义的,所以出了这组大括号依然存在,在类中可以使用,所以输出10和10。
第二段代码中
void input(int x,int y)
{
    x = x;
    y = y;
}
从输出结果来看,说明类的成员变量x和y并没有被赋上值,因为局部变量有最高的优先级,这个函数的=左边的x不是类的成员变量的x,而是void input(int x,int y)里面的x,出了大括号之后失去生命周期。相当于{int x;x=x;}

不知道你明白没有?

#2


计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
但我又不得不承认:
 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物;
 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。
而我本人属前者。

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

十字链表交换任意两个节点C源代码(C指针应用终极挑战) http://download.csdn.net/detail/zhao4zhong1/5532495

#3


这么说吧
void input(int a ,int b)
{
   x = a;
   y = b;
}
定义等价于
void input(int a ,int b)
{
   this.x = a;
   this.y = b;
}
这很正常。但是如果这么定义
void input(int x ,int y)
{
   x = x;
   y = y;
}
等价于
void input(int x ,int y)
{
   this.x = this.x;
   this.y = this.y;
}
这样能看出问题了吧。意思就是说,你定义的函数的形参和成员变量同名的时候,在函数体里引用,就会变成优先有了成员变量,形参没用到。

#4


ls正解,我也学习到了。嘿嘿!

#5


引用 3 楼 hai200501019 的回复:
void input(int x ,int y)
{
   x = x;
   y = y;
}
等价于
void input(int x ,int y)
{
   this.x = this.x;
   this.y = this.y;
}

错了 函数input里面的x 是形参x 不是this->x

#6



函数的实参和形参 和函数的返回值没有关系!


int test_func(int a, int b);//形参a,b

int a =10, b =20;
test_func(a, b); //实参a, b

#7


引用 5 楼 lin5161678 的回复:
Quote: 引用 3 楼 hai200501019 的回复:

void input(int x ,int y)
{
   x = x;
   y = y;
}
等价于
void input(int x ,int y)
{
   this.x = this.x;
   this.y = this.y;
}

错了 函数input里面的x 是形参x 不是this->x

我的意思是,input这么写的话,编译器就这么理解,没有用形参到x,而是直接把成员变量的x和y赋值给自身了,结果自然是5 和5 。不知理解否?

#8


引用 7 楼 hai200501019 的回复:

我的意思是,input这么写的话,编译器就这么理解,没有用形参到x,而是直接把成员变量的x和y赋值给自身了,结果自然是5 和5 。不知理解否?

编译器是就近原则,如果在一个嵌套的作用域里变量和上层变量同名,就会用最里面那层的...
简单来说,你这个例子,除非你指明this->x,不然都是函数里的x,跟成员变量无关

就是x=x,两个都是形参而不是你说的this->x=this->x 不信你改成x=x+1试试,肯定没变化

#9


给你段代码,自己去运行看看就知道了

#include <iostream>
using namespace std;

int x=1;

int main(){
int x=2;
{
int x=3;
{
int x=4;
cout<<x<<endl;
}
cout<<x<<endl;
}
cout<<x<<endl;
cout<<::x<<endl;
getchar();
return 0;
}

#10


引用 7 楼 hai200501019 的回复:
我的意思是,input这么写的话,编译器就这么理解,没有用形参到x,而是直接把成员变量的x和y赋值给自身了,结果自然是5 和5 。不知理解否?
对于input来说 this->x才是外来人口

#11


对于class作用域,成员变量都有this指针,前一种情况,this.x=a;this.y=y,改变了成员变量,当output的时候,cout<<this.x<<" "<<this.y,就是10,10,
后种情况是作用域的问题,局部变量会屏蔽类作用域内的成员变量,因此
void input(int x,int y)
{
    x = x;
    y = y;
}


只是改变局部变量,也就是函数参数的值,并未改变类成员变量的值,因此调用类成员函数,output时候还是5,5

#12


引用 8 楼 Adol1111 的回复:
Quote: 引用 7 楼 hai200501019 的回复:

我的意思是,input这么写的话,编译器就这么理解,没有用形参到x,而是直接把成员变量的x和y赋值给自身了,结果自然是5 和5 。不知理解否?


编译器是就近原则,如果在一个嵌套的作用域里变量和上层变量同名,就会用最里面那层的...
简单来说,你这个例子,除非你指明this->x,不然都是函数里的x,跟成员变量无关

就是x=x,两个都是形参而不是你说的this->x=this->x 不信你改成x=x+1试试,肯定没变化
恩,书上也说了是形参赋给了形参。

#13


引用 1 楼 forever199112 的回复:
形参影不影响实参,不是根据函数有没有返回值来判断的。根据具体的变量作用域来判断。
首先x和y是类point的成员,在类中相当于是全局变量。第一段代码中
void input(int a,int b)
{
    x = a;
    y = b;
}
出了这个大括号范围,因为x和y是在这组大括号之外定义的,所以出了这组大括号依然存在,在类中可以使用,所以输出10和10。
第二段代码中
void input(int x,int y)
{
    x = x;
    y = y;
}
从输出结果来看,说明类的成员变量x和y并没有被赋上值,因为局部变量有最高的优先级,这个函数的=左边的x不是类的成员变量的x,而是void input(int x,int y)里面的x,出了大括号之后失去生命周期。相当于{int x;x=x;}

不知道你明白没有?



那是不是只要是形参和实参是同一名字,函数里的就都是形参之间的运算?

#14


引用 5 楼 lin5161678 的回复:
Quote: 引用 3 楼 hai200501019 的回复:

void input(int x ,int y)
{
   x = x;
   y = y;
}
等价于
void input(int x ,int y)
{
   this.x = this.x;
   this.y = this.y;
}

错了 函数input里面的x 是形参x 不是this->x

----------------------------------------

#include<iostream>
#include<string>
using namespace std;

class point
{
public:
int x,y;
point(int a,int b)

x=a; // 1 处
y=b;
}
void set(int x,int y)
{   //  2处
x=x;
y=y;
}
void get()
{  // 3 处
cout<<x<<endl;
cout<<y<<endl;
}

};

int main()
{
point pt(5,5);
pt.set(10,10);
pt.get();

return 0;

}

------------------------------------------
我单步调试到 2处时(还没有赋值),1处和2处的x y 的值都是由5变成10了;然后调试到3处时(还没有赋值),1处和2处的x y又都由10变成5了,很奇怪啊,到底 2处的 x,y 是指this->x 还是形参int x 啊?好像上面的调试情况都没办法解释啊?求高人解答!!

#15


引用 13 楼 u011829796 的回复:
那是不是只要是形参和实参是同一名字,函数里的就都是形参之间的运算?

跟实参没有任何关系,变量生存有自己的作用域,只要在这个作用域里存在这个名字的变量,就是用这个变量,如果没有就到上一层(嵌套它的外层)去找相应的变量,一层层上去,直到找到对应变量为止,如果不存在编译器就报错

#16


两次都是操作同一个成员 当然改变了  话说这不是参数问题

#17


引用 14 楼 xiangzhihappy 的回复:
------------------------------------------
我单步调试到 2处时(还没有赋值),1处和2处的x y 的值都是由5变成10了;然后调试到3处时(还没有赋值),1处和2处的x y又都由10变成5了,很奇怪啊,到底 2处的 x,y 是指this->x 还是形参int x 啊?好像上面的调试情况都没办法解释啊?求高人解答!!

1处x、y是成员变量的x、y,取了形参a、b的值,所以是5、5
2处用的是形参里的x,y,所以变成了10、10,所以成员变量未发生变化
3处没有形参所以会到外层查找成员变量,所以这里的x、y是this->x就是成员变量,也就是原来的5、5

#18


还有你单步的时候没有看this->x吧,2处成员没变化啊,你在2处看x、y,当然只有2处的x、y值了。
如果不加this进入函数里,而这个作用域里有相同名字的变量,就会变成对应的变量的值,而不是1处成员的值,这点要分清楚啊。

#19


引用 17 楼 Adol1111 的回复:
Quote: 引用 14 楼 xiangzhihappy 的回复:

------------------------------------------
我单步调试到 2处时(还没有赋值),1处和2处的x y 的值都是由5变成10了;然后调试到3处时(还没有赋值),1处和2处的x y又都由10变成5了,很奇怪啊,到底 2处的 x,y 是指this->x 还是形参int x 啊?好像上面的调试情况都没办法解释啊?求高人解答!!

1处x、y是成员变量的x、y,取了形参a、b的值,所以是5、5
2处用的是形参里的x,y,所以变成了10、10,所以成员变量未发生变化
3处没有形参所以会到外层查找成员变量,所以这里的x、y是this->x就是成员变量,也就是原来的5、5


----------------------------
我的意思是2处如果用的是形参的里的x,y,为什么还没有到赋值的时候1处的x,y也变成10了,1处的x,y可是成员变量啊,可不会随着2处的形参x,y的值变化啊? 还请指教。

#20


引用 16 楼 modyaj 的回复:
两次都是操作同一个成员 当然改变了  话说这不是参数问题

如果是同一个成员,那为什么调试到3处的时候,x,y又从10变回到5啊?

#21


引用 19 楼 xiangzhihappy 的回复:
----------------------------
我的意思是2处如果用的是形参的里的x,y,为什么还没有到赋值的时候1处的x,y也变成10了,1处的x,y可是成员变量啊,可不会随着2处的形参x,y的值变化啊? 还请指教。

你在2处的时候,怎么查看1处的变量??1处的x、y是成员,虽然能查看,但是查看的时候必须加this->,因为你2处的形参和成员是同名的。你在2处,如果直接用x、y查看,不论哪一个x、y都是形参的x、y,所以你看到的x、y都变成了10、10.当然如果你的形参不是x、y是其他名字,而且函数里也没有x、y,那么此时你直接用x、y查看是没有问题的。

你在3处的时候用x、y查看可以,是因为你函数里没有x,y,也没有x、y的形参,所以此时的x、y就是成员。

#22


形参与实参的传递

#23


引用 21 楼 Adol1111 的回复:
Quote: 引用 19 楼 xiangzhihappy 的回复:

----------------------------
我的意思是2处如果用的是形参的里的x,y,为什么还没有到赋值的时候1处的x,y也变成10了,1处的x,y可是成员变量啊,可不会随着2处的形参x,y的值变化啊? 还请指教。

你在2处的时候,怎么查看1处的变量??1处的x、y是成员,虽然能查看,但是查看的时候必须加this->,因为你2处的形参和成员是同名的。你在2处,如果直接用x、y查看,不论哪一个x、y都是形参的x、y,所以你看到的x、y都变成了10、10.当然如果你的形参不是x、y是其他名字,而且函数里也没有x、y,那么此时你直接用x、y查看是没有问题的。

你在3处的时候用x、y查看可以,是因为你函数里没有x,y,也没有x、y的形参,所以此时的x、y就是成员。

谢谢啊! 是我调试的时候查看弄错了,现在明白了,谢谢详解!

#24


引用 15 楼 Adol1111 的回复:
Quote: 引用 13 楼 u011829796 的回复:

那是不是只要是形参和实参是同一名字,函数里的就都是形参之间的运算?

跟实参没有任何关系,变量生存有自己的作用域,只要在这个作用域里存在这个名字的变量,就是用这个变量,如果没有就到上一层(嵌套它的外层)去找相应的变量,一层层上去,直到找到对应变量为止,如果不存在编译器就报错

恩,明白了,十分感谢!

#25


引用 20 楼 xiangzhihappy 的回复:
Quote: 引用 16 楼 modyaj 的回复:

两次都是操作同一个成员 当然改变了  话说这不是参数问题

如果是同一个成员,那为什么调试到3处的时候,x,y又从10变回到5啊?

对于
void input(int x, int y)
{
x = x;
y = y;
}
调用时候赋值给x,这个x就是int x 的x,对于x = x; 左右参数都是int x 的 x,和pt.x没有关系,也就是这种情况下,还没有到this.x = x的这步,函数就结束了,y 也同理