Luckyxyz
首页
归档
关于
友链
切换模式
返回顶部
首页
技术实践
书斋絮语
说点儿什么
Luckyxyz
首页
技术实践
书斋絮语
说点儿什么
首页
归档
关于
友链
【软考】编译程序、解释程序、函数、值调用、引用调用
技术实践
·
昨天
Luckyxyz
# 编译程序 解释程序 ## 低级语言 0 1 序列是 机器语言,机器指令程序,是最基本的计算机语言 效率很低、可读性很差、难修改和维护 容易记忆的符号代替机器语言:汇编语言  称,机器语言、汇编语言 为 **低级语言** ## 高级语言 所以在此基础上,开发了 功能更强、抽象级别更高的语言以支持程序设计,于是就产生了面向各类应用的程序设计语言,称为 **高级语言** 常见的高级语言:Java、C、C++、PHP、Python、Delphi、PASCAL 等 这类语言与人们使用的自然语言比较接近,提高了程序设计的效率 需要翻译的过程,翻译成计算机能够看懂的语言,计算机只能理解 0 1 序列 翻译这个过程的,叫做:语言处理程序。语言之间的翻译形式有很多种:基本方式为 汇编、解释、编译 --- # 源程序: 用某种高级语言或汇编语言编写的程序:源程序,源程序不能直接在计算机上执行。 如果源程序是用汇编语言编写的,则需要一个汇编程序将其翻译成目标程序后才能执行。 如果源程序使用某种高级语言编写的,则需要对应的 **解释程序** 或 **编译程序** 对其进行翻译,然后在机器上运行。 --- # 解释程序: 一般用于解释脚本语言 又叫 解释器。 直接解释执行源程序,或者 将源程序先翻译成某种中间代码然后再加以执行 # 中间代码:  # 编译程序: 将源程序 翻译 成 目标语言程序,然后在计算机上运行目标程序。 # 解释程序与编译程序的根本区别: ## 在编译方式下:不参与! 机器上运行的是与源程序等价的 **目标程序**,源程序和编译程序都不再参与目标程序的执行过程 ## 在解释方式下:参与! 解释程序需要参与到程序的运行过程中 源程序 和 编译程序 都不参与 目标程序的运行过程 --- # 程序设计语言基本成分 通用的高级程序设计语言一般都会提供 描述**数据、运算、控制 和 数据传输** 的语言成分,其中, 控制包括:顺序、选择 和 循环结构(重复) --- # 数据类型的作用 许多程序设计语言规定,程序中的数据都必须具有类型,其作用是:? 以 java 为例,会定义很多类型:string、char、byte、int、float、double、long、boolean 等 假设:int a=1,会根据数据类型为他分配一个存储单元,并且这个存储单元(其大小、容量)是静态的(不会动的) 所以 有这些类型:**便于为数据合理分配存储单元** 看两个对象是否可以进行运算,所以是 **便于对参与表达式计算的数据对象进行检查** 动态数据结构:不会分配固定的空间,而是根据元素进行分配。但是跟数据类型没有关系 **规定数据对象的取值范围及能够进行的运算** --- # 函数: 函数定义(C C++):函数首部、函数体。 ## **函数定义** 的一般形式: ```cpp 返回值的类型 函数名(形式参数表,形参){ 函数体 } void f(int n){ n = 528; } ``` **函数调用** 的一般形式: ```cpp 函数名(实参表); f(a); ``` 实参:调用函数的时候传进去的参数 f(5) 那这里的 5 就是一个实参 --- 返回值类型:函数执行完返回什么类型的值,如,`int` `void`(无返回值) 函数名:给函数起的名字,如,`f` `main` 形参类型:接收什么类型的值,如,`int` `double` 形参名:在函数内部用的变量名,如,`n` 函数体:函数要执行的代码,如,`n = 528` 实参:调用时真正传入的值,如,`a` `1` `x+1` --- # 值调用、引用调用 ```cpp void f(int n) { // n 是值传递(pass by value) n = 528; } int main() { int n = 1; f(n); cout << n << endl; } ``` 输出为 1 解释: `f(int n)` 是 **值传递**,函数内部的 `n` 是 `main` 中 `n` 的一份拷贝 函数 `f` 内部对 `n` 的修改,不会影响 `main` 中的 `n` 关键在于:`f(n)` 这个括号里的 `n`,只是把 值 抄了一份过去,并不是把 main 连个变量本身交出去 int n = 1 传的不是一个地址,而是一个值 1 而对于 引用调用来说,通常情况看函数定义那里的参数类型, 引用调用有一个 `&` 是取地址的意思 我的通俗理解: 如果函数 ```cpp void f(int n) { // n 是值传递(pass by value) n = 528; } int main(){ int n=1; f(n); cout << n << endl; } ``` 那么此时是把一个值传过去,只是传了一个苹果过去。 如果我们修改为应用调用: ```cpp void f(int &n){ n = 528; } int main(){ int n = 1; f(n); cout << n << endl; } ``` 相当于把一个框传过去了,无论这个框里曾经有什么,到被调用处 往里装了多少就是多少 值调用,只是传了一个值,这个时候修改形参,是不会影响到实参的 --- # 传值调用 - 形参取的是 实参的值,形参的改变不会导致调用点所传的实参的值发生改变。 - 将实参的值传递给形参,实参可以是变量、常量和表达式 - 不可以实现形参和实参间双向传递数据的效果 # 引用(传址)调用 - 形参取的是实参的值,即 相当于实参存储单元的地址引用,因此 其值的改变同时就改变了实参的值。 - 将实参的地址传给形参,形参必须有地址,实参不能是常量(值),表达式 - 可以实现形参和实参间双向传递数据的效果,即改变形参的值同时也改变了实参的值 & 取地址的意思
软考
取消回复
提交评论
Luckyxyz
我们谈论生活,讨论技术,借由文字,抵达心灵。
热门文章
Obsidian 迁移全记录(又名:纯小白的闭坑指南)
【Kubernetes】第一个实例 - Java Web 应用
新年新气象,关于年终总结,关于未来展望
使用宝塔面板对网站、数据库等进行定时备份到腾讯云 COS 对象存储
2025 年
在细雨中呼喊,在困顿中挣扎
Ubuntu 22.04 server 安装教程
最新评论
山佳Ellen: 有独到的见地,有个性的思想,精彩!
t: 2026 扬帆起航, 喜迎新年,万象更新, 时间旅行,人间探索,...
tls: 赞一个
lovingchina: 我也准备从Joplin迁移到Obsidian,刚好参考你这一篇哈...
tl.s: 很棒的一本书,可以解答很多人们关于人工智能的疑惑。或许未来怎样谁...
tl.s: 很实用 🦆🦆
tl.s: 绘图很清晰,图示质量很高
热门标签
Kubernetes
读书笔记
Linux
软考
Ubuntu
生活随笔
生活
2025
Python3
Debian
Ansible
空间智能
openFuyao
技术实践
在细雨中呼喊
粤ICP备2024349207号