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

对于循环的一次探索

写算法题的时候突然想到,为什么循环内定义变量不会算作是重复定义,以及变量作用域问题,为此,进行了一次探索


c:

代码:

#include <stdio.h>
int main()
{int a = 0;int* b = &a;for (int i = 0; i < 3; i++) {printf("%d\n", a);printf("%p\n",&a);int a = i;printf("%d\n", a);printf("%p\n", &a);printf("------------------\n");}return 0;
}

运行结果:

0
010FF91C
0
010FF8F8
------------------
0
010FF91C
1
010FF8F8
------------------
0
010FF91C
2
010FF8F8
------------------

java:

代码:

public class Main{public static void main(String[]args) {int a = 1;for(int i = 0 ;i<2;i++){int a = i;System.out.println(a);System.out.println("---------------------");}}
}

java: 已在方法 main(java.lang.String[])中定义了变量 a


go:

代码:

import "fmt"func main() {a := 0for i := 0; i < 3; i++ {fmt.Println(a)fmt.Println(&a)var a = ifmt.Println(a)fmt.Println(&a)fmt.Println("________________________")}
}

结果:

0
0xc00000a0b8            
0                       
0xc00000a100            
________________________
0                       
0xc00000a0b8            
1                       
0xc00000a110            
________________________
0                       
0xc00000a0b8            
2                       
0xc00000a120            
________________________

查阅资料得知,这个属于是变量作用域的问题,局部变量如果超出作用域就会销毁,正如C语言代码运行结果那样,循环内定义同一变量的地址值是不会改变的。

而且代码在编译时,会将重复定义的变量”提出“到循环外定义,也就是说,在循环内定义和循环外定义在占用内存上几乎一样

至于同名变量可以既在循环内定义,又在循环外定义,这点还是跟作用域有关,但为什么java不能这样定义,emmm,没有查到相关资料,知道的可以补充一下


还有个问题,那为什么go定义出来的变量地址不一样呢?是没有销毁原来的局部变量吗?这就要说到Go 有 escape analysis, 在编译期,它会分析你的变量是否在函数执行完毕那一刻,程序有没有可能有别的对象引用到它(所谓逃逸),如果没有,那这个变量就可以在栈上分配,完全不经过 gc,如果它已经逃逸了,那就不知道什么时候才能gc了~

这个代码中的逃逸是由于fmt导致的,我们不妨不恰当的修改一下代码

import "fmt"func main() {a := 0for i := 0; i < 3; i++ {println(a)println(&a)var a = iprintln(a)println(&a)fmt.Println("________________________")}
}

结果:

0
0xc00006ff18            
0                       
0xc00006ff10            
________________________
0                       
0xc00006ff18            
1                       
0xc00006ff10            
________________________
0                       
0xc00006ff18            
2                       
0xc00006ff10            
________________________

可以看到,当我们不使用标准输出流,而是使用标准错误流打印的时候,可能就不会触发逃逸,看到此时地址是一样的,也就是印证了我们上面的结论。

相关文章:

对于循环的一次探索

写算法题的时候突然想到&#xff0c;为什么循环内定义变量不会算作是重复定义&#xff0c;以及变量作用域问题&#xff0c;为此&#xff0c;进行了一次探索 c&#xff1a; 代码&#xff1a; #include <stdio.h> int main() {int a 0;int* b &a;for (int i 0; i …...

设计模式:简介及基本原则

简介 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问&#xff0c;设计模式于己于他人于系统都是多赢的&#xff0c;设计模式使代码编制真正工程化&#xff…...

营销领域有哪些著名的模型?如销售漏斗等

一、金字塔原理 模型 适用场景&#xff1a;提案 沟通 思考理论 模型 来源&#xff1a;麦肯锡 芭芭明托 1、表达的逻辑 遵循金字塔模型的逻辑&#xff0c;先说结论&#xff0c;后说论据。所有表达的内容都可归纳出一个核心论点。这个核心论点由N个论据作为支持&#xff0c;而…...

JavaScript学习-let、var、const的使用

let、var、const的使用 1.var var声明的变量会被提升到该作用域的顶部&#xff0c;若声明在函数内部&#xff0c;则他作用域在整个函数内部&#xff0c;即使他在函数末尾声明&#xff0c;在函数第一行也可以使用。声明在全局也是一样的。var不能声明常量&#xff0c;因为var可…...

【Java】SpringMVC参数接收(一)

1、接收单个参数 &#xff08;1&#xff09;直接接收参数 RequestMapping("/hello") RestController public class HelloSpring {RequestMapping("/t2")public String t2(String name){return "name" name;} } 当没有传入参数时&#xff0c;返…...

File类知识点回顾

File类简介 File 是文件和目录路径名的抽象表示。 用户界面和操作系统使用依赖于系统的路径名字符串来命名文件和目录。 此类提供了一个抽象的&#xff0c;与系统无关的分层路径名视图。 抽象路径名有两个组成部分&#xff1a;可选系统有关的前缀字符串&#xff0c;如磁盘驱动…...

2024新版68套Axure RP大数据可视化大屏模板及通用组件+PSD源文件

Axure RP数据可视化大屏模板及通用组件库2024新版重新制作了这套新的数据可视化大屏模板及通用组件库V2版。新版本相比于V1版内容更加丰富和全面&#xff0c;但依然秉承“敏捷易用”的制作理念&#xff0c;这套作品也同样延续着我们对细节的完美追求&#xff0c;整个设计制作过…...

Optional lab: Linear Regression using Scikit-LearnⅠ

scikit-learn是一个开源的、可用于商业的机器学习工具包&#xff0c;此工具包包含本课程中需要使用的许多算法的实现 Goals In this lab you will utilize scikit-learn to implement linear regression using Gradient Descent Tools You will utilize functions from sci…...

CentOS使用

1.使用SSH连接操作虚拟机中的CentOS 使用代理软件(MobaX/Xshell)通过ssh连接vmware中的虚拟机,可以摆脱vmware笨重的软件,直接在代理软件中进行操作. 包括使用云虚拟器,其实也只是在本地通过ssh连接别处的云服务商的硬件而已. 1.1 配置静态IP 为什么要配置静态IP? 想要使用…...

[SWPUCTF 2018]SimplePHP1

打开环境 有查看文件跟上传文件&#xff0c;查看文件里面显示没有文件url貌似可以文件读取 上传文件里面可以上传文件。 先看一下可不可以文件读取 /etc/passwd不能读取&#xff0c;源码提示flag在f1ag.php 看看能不能读取当前的文件&#xff0c; 先把代码摘下来 file.php …...

api管理工具的新发现

一、之前用过的api管理工具 关于api管理工具&#xff0c;之前用过yapi和postman&#xff0c;但是后来发现了这两个工具 二、新发现的更强大的&#xff1a;Apifox和Eolink Apifox和Eolink&#xff0c;那这两个工具有什么优势呢&#xff1f; 2.1Apifox 其中 Apifox Postman …...

2024 年 eBPF 和网络趋势预测

本文地址&#xff1a;2024 年 eBPF 和网络趋势预测 | 深入浅出 eBPF 1. eBPF 1.1 eBPF 将继续呈指数增长1.2 eBPF 应用市场1.3 eBPF 在手机中得到更广泛的应用1.4 eBPF 滥用带来的风险2. 可观测 2.1 最受欢迎的可观测性2.2 降低可观测性开销2.3 上下文感知的 Kubernetes 工作负…...

2024.1.27 GNSS 学习笔记

1.精确的描述轨道的一组数据(星历)是实现精确定位与导航的基础。 2.GNSS卫星广播星历的提供方式一般有两种&#xff1a;一种是提供开普勒轨道参数和必要的轨道摄动改正项参数&#xff0c;如GPS、BDS、Galileo三大系统采用此种模式&#xff0c;还有QZSS系统&#xff1b;另一种是…...

Unity - 将项目转为HDRP

Camera window -> Package Manager 之后会出现HDRP向导窗口&#xff0c;均点击修复。 在Edit中&#xff0c;更改项目中的材质...

ETCD高可用架构涉及常用功能整理

ETCD高可用架构涉及常用功能整理 1. etcd的高可用系统架构和相关组件1.1 Quorum机制1.2 Raft协议 2. etcd的核心参数2.1 常规配置2.2 特殊优化配置2.2.1 强行拉起新集群 --force-new-cluster2.2.2 兼容磁盘io性能差2.2.3 etcd存储quota 3. etcd常用命令3.1 常用基础命令3.1.1 列…...

深度学习中RGB影像图的直方图均衡化python代码and对图片中指定部分做基于掩模的特定区域直方图均衡化

深度学习很重要的预处理步骤 就是需要对做直方图均衡化 其中主要分成灰度图以及RGB图的直方图均衡化 这俩的方法和代码不同 想要去看具体原理的朋友可以查看下面这篇博客的内容 写的很详细颜色直方图均衡化(https://www.cnblogs.com/wancy/p/17668345.html) 我们这个场景中会用…...

PyTorch深度学习实战(33)——条件生成对抗网络(Conditional Generative Adversarial Network, CGAN)

PyTorch深度学习实战&#xff08;33&#xff09;——条件生成对抗网络 0. 前言1. 条件生成对抗网络1.1 模型介绍1.2 模型与数据集分析 2. 实现条件生成对抗网络小结系列链接 0. 前言 条件生成对抗网络 (Conditional Generative Adversarial Network, CGAN) 是一种生成对抗网络…...

编写Bash脚本程序从记录文件中提取history命令的优化,再介绍linux bash语法和结构

目 录 一、引言 二、脚本代码实现 三、bash语法和结构 &#xff08;一&#xff09;基本语法 1、脚本开始与结束 2、注释 3、变量 4、数据类型 5、控制结构 6、循环控制 7、函数 8、算术运算 9、算术操作符和逻辑操作符 &#xff08;二&#xff09;命令相关…...

Python中Numba库装饰器

一、运行速度是Python天生的短板 1.1 编译型语言&#xff1a;C 对于编译型语言&#xff0c;开发完成以后需要将所有的源代码都转换成可执行程序&#xff0c;比如 Windows 下的.exe文件&#xff0c;可执行程序里面包含的就是机器码。只要我们拥有可执行程序&#xff0c;就可以随…...

Spring Boot Aop 执行顺序

Spring Boot Aop 执行顺序 1. 概述 在 spring boot 项目中&#xff0c;使用 aop 增强&#xff0c;不仅可以很优雅地扩展功能&#xff0c;还可以让一写多用&#xff0c;避免写重复代码&#xff0c;例如&#xff1a;记录接口耗时&#xff0c;记录接口日志&#xff0c;接口权限&…...

100天精通鸿蒙从入门到跳槽——第16天:ArkTS条件渲染使用教程

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》 — Go语言学习之旅!《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师!100天…...

【Linux C | 进程】Linux 进程间通信的10种方式(1)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

橘子学Mybatis08之Mybatis关于一级缓存的使用和适配器设计模式

前面我们说了mybatis的缓存设计体系&#xff0c;这里我们来正式看一下这玩意到底是咋个用法。 首先我们是知道的&#xff0c;Mybatis中存在两级缓存。分别是一级缓存(会话级)&#xff0c;和二级缓存(全局级)。 下面我们就来看看这两级缓存。 一、准备工作 1、准备数据库 在此之…...

看图说话:Git图谱解读

很多新加入公司的同学在使用Git各类客户端管理代码的过程中对于Git图谱解读不太理解&#xff0c;我们常用的Git客户端是SourceTree&#xff0c;配合P4Merge进行冲突解决基本可以满足日常工作大部分需要。不同的Git客户端工具对图谱展示会有些许差异&#xff0c;以下是SourceTre…...

linux新增用户,指定home目录和bash脚本且加入到sudoer列表

前言 近3年一直用自动化脚本&#xff0c;搞得连useradd命令都不会用了。哈哈。 今天还碰到一个问题&#xff0c;有个系统没有‘useradd’和‘passwd’命令&#xff0c;直接蒙了。当然直接用apt install就能安装&#xff0c;不然还得自己编译折腾一会。新建用户 useradd -d /h…...

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程 和之前实现的YOLOv2一样&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv3的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv3检测器&#xff0c;来对YOLOv3有…...

OpenGL/C++_学习笔记(四)空间概念与摄像头

汇总页 上一篇: OpenGL/C_学习笔记&#xff08;三&#xff09; 绘制第一个图形 OpenGL/C_学习笔记&#xff08;四&#xff09;空间概念与摄像头 空间概念与摄像头前置科技树: 线性代数空间概念流程简述各空间相关概念详述 空间概念与摄像头 前置科技树: 线性代数 矩阵/向量定…...

C语言2024-1-27练习记录

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>//int main() //{ // char c[15] { I, ,a,n,d, ,you,. }; // int i; // for(i 0; i < 15; i) //这个地方有几个地方需要注意一下&#xff0c;首先变量指定之后必须要加上英文状态下的分号 // printf("%c&q…...

深入解析HTTPS:安全机制全方位剖析

随着互联网的深入发展&#xff0c;网络传输中的数据安全性受到了前所未有的关注。HTTPS&#xff0c;作为HTTP的安全版本&#xff0c;为数据在客户端和服务器之间的传输提供了加密和身份验证&#xff0c;从而确保了数据的机密性、完整性和身份真实性。本文将详细探讨HTTPS背后的…...

【197】JAVA8调用阿里云对象存储API,保存图片并获取图片URL地址。

实际工作中&#xff0c;需要用阿里云对象存储保存图片&#xff0c;并且在上传图片到阿里云对象存储服务器后&#xff0c;获取图片在阿里云对象存储服务器的URL地址&#xff0c;以便给 WEB 前端显示。 阿里云对象存储上传图片的工具类 package zhangchao;import com.aliyun.os…...