1 函数内部变量的局部性

在一个函数中定义的变量(包括实参),其作用域仅限于定义它的函数中,在其它的函数不能使用,这种变量称为“局部变量”。

局部变量的作用域:函数内部声明和定义的语句块(实参为整个函数),屏蔽语句块外的同名变量;

局部变量的存续期:在函数内部声明开始到语句块结束位置。

定义在函数之外的变量,其作用域范围为定义该变量的程序位置直到程序的结束,在其它的函数中,既可以使用该变量的值,对变量值的改变也在该变量的全部作用域范围内有效,这种变量称为“全局变量”。

2 清晰了解函数的调用、返回机制和流程

函数可以嵌套调用(不能嵌套定义),函数内部以return返回:

函数也可以递归调用(类似于嵌套调用):

对于递归调用,可以理解为函数体副本机制为n份,其实只有一份,只是局部变量和参数及返回位置在栈中有函数桢的副本。

3 函数调用是函数抽取的逆操作

我们在写代码时,当发现有一块可以利用的完成某一功能的代码时,便可将其封装成一个函数,且通过设置参数和适当的return方式让其在调用时更有一般性或通用性。我们想简单理解函数的传参、返回、调用,反过来,便可以想像将一个函数的函数体如何插回调用的位置(函数调用的实质也可以想像为函数体在调入点的插入)。

正如带参数的封装不会只是加一个函数体那么简单,插回肯定也不只是函数体复制回那么简单。

形参:左值,实参:右值,如:

int v =vp=vf=11;传值:f(int n =v)传指针:f(int* p = &vp)传引用:f(int& f = vf)在函数体中,函数体中的左值使用上述引用中的左值,函数体中的右值使用对应的右值。

想像一下,如果是值传递,或用const修饰的指针或引用传递,当时函数封装肯定考虑的是调用函数与封装函数相互之间的独立性,怎样将函数体插回呢?函数体中的变量参数如果用做左值时,则左值用形参,右值表达式中用右值即可,通过副本机制,可以达到不同的存储空间相互不受影响。

如果是指针传递呢?函数体中的参数则只需将解引用替换成变量参数即可。

如果是引用传递呢?函数体中的参数可以不做改变,因为引用本身就是一个有常量性质的由编译器实现了自动解引用的特殊指针,性质上像指针(形参),使用上像普通的存储数据值的变量(实参及函数体内的使用)。

对于主调函数,如果将被调函数用在表达式或参数中,利用被调函数的左值代替即可。

理解了上述想法,你就可以更好地理解以下概念了。

3.1 参数的输入性与输出性

一般而言,可以用过传址(包括指针、引用传递)实现输出性,输入性与输出性也可以理解为单向性与双向性,传值只实现了单向的数据输入(读操作),而传址却可以实现对调用函数中局部变量的修改(写操作)。通常,输入参数写在参数列表中的左边,输出参数写在参数列表中的右边。

3.2 副本与副作用

参数与返回值都使用了副本机制,只是传址或地址返回(包括指针和引用)的副本是一个地址,而传值或值返回却是一个临时对象(数据的完整复制)。

这里的副作用还是上述参数的输出性,因为传址,相当于调用函数与被调函数之间有了双向性,有可能完成写(左值更改)操作,也就产生了副作用(好处是函数之间通过这种副作用能形成联系,坏处是函数封装性的一种破坏)。

以上内容也可以总结为调用函数与被调函数之间的关系:

传值:相互之间独立(因为单向性或输入性或只读操作);

传址:相互之间依赖(因为双向性或输出性或可写操作),

3.3 左值与右值

按出现在表达式的位置及是否可以寻址可以将变量和表达式区分左值和右值。

传址的实参必须是变量,而传址的实参可以是左值也可以是右值。

如果是引用返回,函数调用还可以用做左值。

-End-

vue函数如何调用其他函数?_编程|如何简单理解函数的传参、返回、调用相关推荐

  1. C++入门_编程如此简单

    为什么计算机能管理庞大的系统?为什么人能指挥计算机按自己的想法做事?计算机能超越人的思维吗?面对计算机,很多人都会带着或多或少的疑问.其实,计算机是通过执行一个个程序来实现各种神奇的功能.人们要指挥计 ...

  2. keras框架入门学习(一)——argparse传参模块调用

    keras框架入门学习(一)--argparse传参模块调用 一.argparse模块简介 1.1 argparse的定义 1.2 argparse的优势 二.argparse模块使用 2.1 实现[ ...

  3. 任务(多线程并行)TFDMemTable内存表传参方式调用服务器返回的TDataSet

    任务(多线程并行)TFDMemTable内存表传参方式调用服务器返回的TDataSet 服务器端: function TServerMethods1.getTFDDataSet   ( const p ...

  4. 小程序入门学习06--data、url传参、调用豆瓣api

    豆瓣不能用了,可以用这个 data- 自定义数据属性 设置 <view class='container movie-card' bindtap='f1' data-user-name=&quo ...

  5. c语言调用dll实例 结构体传参,Matlab调用Dll,对于自定义结构体数组如何传参? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    %[例子1] % Matlab调用DLL,整形数组传参 v = [1,22,33;44,-56,67]; pv = libpointer('int16Ptr',v); m = get(pv,'Valu ...

  6. Java学习第八天<什么是方法><方法的定义和调用><方法的重载><命令行传参><可变参数><递归详解>

    什么是方法 System.out.println(); 调用系统类里的标准输出对象(out)中的方法println public class Demo01 {//main 方法public stati ...

  7. alert()的功能_前端实现简单的图片上传小图预览功能

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  8. @modelattribute注解用postman测试怎么传参_谁要是再敢用Map传参,我过去就是一JIO...

    还记得上次我写过一篇关于实际项目代码分层和规划的文章<看完这篇,别人的开源项目结构应该能看懂了>, 在文尾处提到过一些注意事项,其中第一条就是: Contorller层参数传递建议不要使用 ...

  9. c语言代码中调用系统命令行.sh shell脚本,linux shell system传参

    C语言代码中调用命令行: 1. 使用system(" 命令行 ");    --  执行完命令行后,会返回原先C代码的位置,继续执行. 2. 如果命令行中需要传参,使用 sprin ...

最新文章

  1. 秋招必考——Batch Normalization精简解析
  2. 伯克利的电气工程和计算机科学专业,2021年加州大学伯克利分校电气工程与计算机科学专业入学要求高吗?...
  3. 在Visual Studio 2008中编译snort-2.8.6.1.tar.gz
  4. R语言:paste函数解析
  5. ITK:通过包装填充图像
  6. 学习并整理windows下编译nginx的步骤
  7. 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试
  8. Windows下一个可与其他数据集控件结合的通用的搜索框GUSIconEdit
  9. vue4 跳转外部链接_vue跳转到外部链接
  10. 费尔德曼的百吉饼实验:人类的诚实程度其实超出你的想象!
  11. xugang 记录一个.NET 程序员的成长 asp.net水晶报表的一些问题
  12. springBoot集成Mybatis-Generator
  13. 苹果手机添加 qq 邮箱的方法
  14. mini-pcie接口(EC20和N720)
  15. python代码库-这7个开源的Python库,让你轻松代码分析
  16. 互融云工业品电商系统上线:科技助力互联网与实体经济深度融合
  17. ECNUOJ 2616 游黄山
  18. python_计算一张纸对折多少次超过珠峰
  19. 世嘉土星系统memory mapping システムの使用するメモリのマッピングについて
  20. 6个杰出的国产APP推荐,你知道多少呢?

热门文章

  1. js--window关闭事件
  2. 2009-03-24 20:01 Matlab 7.0 添加BNT工具箱(转)
  3. 推荐两个在线格式化JavaScript代码的网站
  4. 微型计算机的使用寿命,微型计算机使用注意事项及保养的一般方法
  5. python判断list集合中是否包含某个元素_python怎样判断list是否包含某个元素
  6. linux语言yhq,linux通过docker安装kafka
  7. python同时满足两个条件_python算法-快速寻找满足条件的两个数
  8. 电脑显示没有被指定在上运行_可以桌面显示的便条便签怎么弄?有没有电脑桌面上的便条贴...
  9. linux socket read 接受缓存为空_Linux直接IO、缓存IO、阻塞与同步?
  10. 算法与程序设计_算法与程序设计入门-简单计算题1