百科问答小站 logo
百科问答小站 font logo



求助:C++中应该怎样理解实参和形参的区别? 第1页

  

user avatar   wen-wu-zun-zhe 网友的相关建议: 
      

形参和实参的概念其实没有意义。

       // x, y 形参 int max(int x, int y); // a, b 实参 max(a, b);     

现实中,根本没人说形参x,y,实参a,b,都统一用参数x,y,参数a,b表示。

英语有时候x,y会用parameter,也就是形参, a,b会用argument,也就是实参。但实际上大部分人也是混用的,有时候无论形参实参全用parameter,有时候全用argument,都代表参数。

形参和实参这两个词如果你全部用参数代替,也不会有任何歧义。给定代码,参数x,y,参数a,b,你是马上就知道他指的是什么,根本就不需要形参和实参来区分。并且区分出来其实也没什么意义。。

所谓形参和实参互不影响,这种书就不要读了。形参和实参的概念稍微提一下知道就行了,都没必要深入的东西,要强求新手去理解他背后的汇编机器代码(为何形参和实参互不影响),简直是反人类。这种没用的规则放弃就好了,没必要背,编程多了,再回来看这句话,自然就理解他什么意思了。


user avatar   haozhi-yang-41 网友的相关建议: 
      

我一直认为,在C/C++里,“形参”和“实参”这两个概念是完全没必要的凭空捏造的垃圾概念。

事实上,从CPU架构和指令的角度来说,无论是寄存器传参还是压栈传参,传参就只有一种形式:传值。所区别的无非是这个“值”是实际的值还是指针的值(地址)而已——你把指针理解了,自然就理解了。

如果有些高级语言废除了指针的概念,那弄点其它概念去绕也行。但是对于C/C++,一句话就说清楚的事,根本没必要绕这些。


再补充一些:如果不用形参、实参之类的垃圾概念,怎么解释你的例子。

首先明确一点,你的两个例子两个函数的四个参数里,只有那个A是传了指针的,其它都是传数值。如果你能理解指针的概念,你就知道为什么A在函数里改了在外面也会变,而其他的不变了。

剩下的问题可能就是:为什么参数A传的是指针?这就是纯语法方面的问题了。如果你想学得仔细点的话,可以学习一下隐式转换相关的内容,尤其是你这里涉及的指针和数组之间隐式转换。如果不想弄那么仔细,也没问题,对于语法类问题,基本上都可以简单粗暴的俩字回答:规定。


我再解释一下形参这概念到底有多坑爹吧:

首先,你要说形参实参这概念没有呢,倒也不是——但C99的标准文档里面,通篇只有一个地方提到了formal parameter/actual argument这个术语,就是在一开头的术语表里,之后全篇都再也没用过这个术语了。

然后,我再截两个图,让大家看看他这个唯一用到这个术语时的说法:

我相信大家一定认得括号里的那个单词是什么意思的。而且还重复的把formal/actual和argument/parameter排列组合的全列一遍,说明基本上两者是混来混去的用的。

实际上,自己读一下里面的内容就知道了,这种东西你硬要分,那就只能是在词法语法上去区分的。你要是搞编译器前端,做什么语法分析的时候,去仔细读一下这两段东西,有用。但是对于99%一辈子不接触编译器前端的C/C++开发人员来说,就是毫无意义的。至于说在初学者中间普及甚至强调这种晦涩概念,那更是扯蛋。




  

相关话题

  如何评价 C++ 11 auto 关键字? 
  c++怎么在1到n这些数中随机产生k(k<n)个?当然,k个数互不相等。有什么比较好的写法吗? 
  C++异常处理写的代码太丑怎么办? 
  C/C++ 数组大小需要是2的倍数吗? 
  C++ 有类似C语言container_of这种,通过指针访问对象的方法么? 
  最短的可以造成崩溃且编译器无法优化掉的 C++ 代码是什么? 
  c++的list什么时候用? 
  C++ 的 switch 为什么不自动加 break? 
  malloc申请的内存能是虚拟内存吗,也就是申请的一块新的空间,刚申请就缺页吗? 
  C++为何不允许在函数中直接传递数组? 

前一个讨论
观测事实何以为事实?
下一个讨论
如何看待OneWeb卫星差点撞上SpaceX的卫星?





© 2024-12-22 - tinynew.org. All Rights Reserved.
© 2024-12-22 - tinynew.org. 保留所有权利