当前位置: 首页 > news >正文

编程语言漫谈之「初始化与赋值」——以C++和汇编语言为示例

编程语言漫谈之「初始化与赋值」——以C++和汇编语言为示例

  • 1. 赋值时汇编做了什么
  • 2. 在变量定义时做初始化, 与在使用时才进行初始化, 有区别吗?

1. 赋值时汇编做了什么

当我们在C++中写下如下代码:

int main() {int a = 10;return 0;
}

这是一个简单的整数类型变量a的初始化赋值. 我们知道, 如果只定义了一个变量,而没有进行初始化, 后面取这个值时,可能会取出一串奇怪的数字.
那么回到最基本的汇编语言, 赋值操作做了什么?

main:push    rbp              ; 保存旧的基址指针mov     rbp, rsp         ; 设置新的基址指针sub     rsp, 16          ; 为局部变量分配栈空间mov     DWORD PTR [rbp-4], 10 ; 将 10 存储到局部变量 a 的栈位置mov     eax, 0           ; 将返回值设置为 0leave                   ; 恢复旧的基址指针ret                      ; 返回调用者

2. 在变量定义时做初始化, 与在使用时才进行初始化, 有区别吗?

在static 修饰局部变量时, 是有区别的
例如,

#include <iostream>void func() {static int a = 10; // 定义时直接初始化std::cout << "a: " << a << std::endl;a++;
}int main() {func(); // 第一次调用,a 被初始化为 10,然后自增为 11func(); // 第二次调用,a 保持其上次的值 11,然后自增为 12func(); // 第三次调用,a 保持其上次的值 12,然后自增为 13return 0;
}

而如果在使用时才进行初始化:

#include <iostream>void func() {static int a; // 只声明但未显式初始化a = 10; // 每次调用函数时都将 a 赋值为 10a++; // 自增std::cout << "a: " << a << std::endl;
}int main() {func(); // 第一次调用, 11func(); // 第二次调用, 11func(); // 第三次调用, 11return 0;
}
http://www.lryc.cn/news/409391.html

相关文章:

  • windows使用ssh-agent管理私钥
  • PostgreSQL 之 to_timestamp函数
  • USB3.0的等长要求到底是多少?
  • 力扣高频SQL 50题(基础版)第二十五题
  • 【C++题解】1581. 马里奥的银币1
  • system和popen函数的异同点
  • Python小工具之httpstat网络分析
  • 挑战房市预测领头羊:KNN vs. 决策树 vs. 线性回归
  • Docker 基础知识
  • 视频主题Qinmei 3.0视频站源码_WordPress影视视频主题/附详细安装教程
  • 数字看板:跨行业需求下的创新与升级
  • 02、爬虫数据解析-Re解析
  • 掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了
  • JavaScriptfor循环的树形菜单栏·
  • easyExcel 3.x以上版本导入数据后,再把错误信息导出,外加自定义RGB背景色、行高、宽度等
  • React的img图片路径怎么写
  • UGUI优化篇--UGUI合批
  • FineBI连接MySQL5.7
  • 基于tkinter的学生信息管理系统之登录界面和主界面菜单设计
  • web基础以及http协议
  • DataEase一键部署:轻松搭建数据可视化平台
  • 网络安全相关竞赛比赛
  • Vscode——如何快速搜索项目工程中的某个文件的位置
  • Kubernetes 正在弃用 Docker?Docker将何去何从?
  • 编程语言「描述符」漫谈——以C++与Rust为例的行为声明与类型描述
  • 电脑屏幕录制软件哪个好?推荐3款,满足各种录制需求
  • 大模型学习应用 1:用 itrex 创新高效实现 LLM 的部署和微调
  • 【Android】碎片—动态添加、创建Fragment生命周期、通信
  • 前端 SSE 长连接
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?