程序员进阶系列:你真的懂 HelloWorld 吗?

Trans论文复现:电池储能调峰和调频:超线性增益的联合优化程序代码! 本程序参考一区SCI期刊《Using Battery Storage for Peak Shaving and Frequency Regulation: Joint Optimization for Superlinear Gains》,程序。与之前将电池储能用于单一应用相比,研究结果表明,如果电池联合提供多种服务,它们可以获得比以前想象的更大的经济效益。欢迎感兴趣的小伙伴关注下方公众号获取完整版代码哦~,小编会继续推送更有质量的学习资料、文章程序代码~限于篇幅,仅列出部分算例的结果! 阅读详情

作为入了门的 Java 程序员,相信在脑海中都能够秒写出 HelloWorld.java,都知道编译成 HelloWorld.class,然后就可以跨平台执行了。

常言道:知人知面不知心。敢问,你真的懂 HelloWorld.class 吗?你真的懂她的内心吗?

不清楚,也无所谓,只因有一颗求知的心。

先让慌乱的内心平静下来,跟随小猿的脚步,一起从字节码层面看看 HelloWorld。希望通过此篇分享对字节码文件有个全局的认识,并对 HelloWorld 执行原理有个大致的了解。

1

 准备:工欲善其事必先利其器  

首先具备 Java 环境(能打开此文章,说明你肯定具备此环境)。

能开发代码的工具(不强求IntelliJ IDEA),然后写出如下图 HelloWorld.java 就可以。

编译 HelloWorld.java 源文件,生成对应的字节码文件。

然后需要一个能查看 class 文件的工具(不强求UltraEdit,只要能查看 16 进制的文件就行,俗称:Hex Viewer),如果按照默认记事本,打开 class 文件的效果是这样子的。

这打开的方式肯定不对,换种开启的方式,用 UltraEdit(本文统称 UE) 进行打开。

虽然不是乱码,但是还是看不懂啊,不过仔细瞧。引入眼帘的便是开头的 CA FE BA BE(咖啡宝贝) ,这个东西叫做魔数。

每个 class 文件的头 4 个字节被称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的 class 文件。

如若要是这么说下去,估计都会彻底疯掉,换种方式进行分解。

接下来对 HelloWorld.class 文件进行反编译,当然推荐可以使用工具 ClassPy、JavaClassViewer、jclasslib 查看 class 文件结构,本次就用 jdk 自带的命令 javap 来查看 class 文件的结构,并把反编译的内容重定向输出到文件 hello_javap.txt 中。

javap -v HelloWorld.class >> hello_javap.txt

javap 是 Java class 文件分解器,可以反编译,也可以查看 java 编译器生成的字节码,用于分解 class 文件,可以解析出当前类对应的 code 区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。

上面的所有的准备工作,皆是为了得到 hello_javap.txt 文件。

Classfile /D:/workspace/codeonce/out/production/codeonce/think/twice/code/once/HelloWorld.class
  Last modified 2020-8-23; size 578 bytes
  MD5 checksum 20602b9ebb70bbd1247c77f3729ec8d5
  Compiled from "HelloWorld.java"
public class think.twice.code.once.HelloWorld
  SourceFile: "HelloWorld.java"
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#20         //  java/lang/Object."<init>":()V
   #2 = Fieldref           #21.#22        //  java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #23            //  Hello World!
   #4 = Methodref          #24.#25        //  java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #26            //  think/twice/code/once/HelloWorld
   #6 = Class              #27            //  java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               LocalVariableTable
  #12 = Utf8               this
  #13 = Utf8               Lthink/twice/code/once/HelloWorld;
  #14 = Utf8               main
  #15 = Utf8               ([Ljava/lang/String;)V
  #16 = Utf8               args
  #17 = Utf8               [Ljava/lang/String;
  #18 = Utf8               SourceFile
  #19 = Utf8               HelloWorld.java
  #20 = NameAndType        #7:#8          //  "<init>":()V
  #21 = Class              #28            //  java/lang/System
  #22 = NameAndType        #29:#30        //  out:Ljava/io/PrintStream;
  #23 = Utf8               Hello World!
  #24 = Class              #31            //  java/io/PrintStream
  #25 = NameAndType        #32:#33        //  println:(Ljava/lang/String;)V
  #26 = Utf8               think/twice/code/once/HelloWorld
  #27 = Utf8               java/lang/Object
  #28 = Utf8               java/lang/System
  #29 = Utf8               out
  #30 = Utf8               Ljava/io/PrintStream;
  #31 = Utf8               java/io/PrintStream
  #32 = Utf8               println
  #33 = Utf8               (Ljava/lang/String;)V
{
  public think.twice.code.once.HelloWorld();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0       
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return        
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lthink/twice/code/once/HelloWorld;


  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String Hello World!
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return        
      LineNumberTable:
        line 5: 0
        line 6: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  args   [Ljava/lang/String;
}

如此这般,天书一样,着实让人头大... ...心莫慌,再次让慌乱的内心平静下来,跟随小猿的脚步,一起去分析字节码文件,尝试彻底搞懂它。

2

 解剖:化繁为简,逐个拆解。

一:Classfile 文件信息

Classfile /D:/workspace/codeonce/out/production/codeonce/think/twice/code/once/HelloWorld.class //class文件的路径
  Last modified 2020-8-23; size 578 bytes //最后一次修改时间以及该class文件的大小
  MD5 checksum 20602b9ebb70bbd1247c77f3729ec8d5 //该类的MD5值
  Compiled from "HelloWorld.java" //编译自源文件名

这块感觉不用详细解释,仔细去看,应该都能懂。

第 1 行:class 文件的路径
第 2 行:最后一次修改时间;该 class 文件的大小。
第 3 行:MD5 checksum 值,例如下载文件的场景下会用于检查文件完整性,检测文件是否被恶意篡改。
第 4 行:编译自 HelloWorld.java 源文件。

二:类主体部分定义信息

public class think.twice.code.once.HelloWorld  //包名及类名
  SourceFile: "HelloWorld.java" //源文件名
  minor version: 0 //次版本号
  major version: 52 //主版本号,52 对应 JDK 1.8
  flags: ACC_PUBLIC, ACC_SUPER //该类的权限修饰符(访问标志)

重点关注第 3、4 两行,为什么要重点关注呢?业务开发中估计多数都遇到过 Unsupported major.minor version 的错误。其实就是通过高版本的 JDK 进行编译(例如 JDK 1.8),然后跑在低版本的 JDK 上(JDK 1.5),就会报版本不支持。

为了使用方便,特意整理一 JDK 各版本图,请拿走不谢。

三:常量池信息

Constant pool: // 常量池,#数字相当于是常量池里的一个索引
   #1 = Methodref          #6.#20         //  java/lang/Object."<init>":()V //方法引用
   #2 = Fieldref           #21.#22        //  java/lang/System.out:Ljava/io/PrintStream; //字段引用
   #3 = String             #23            //  Hello World!
   #4 = Methodref          #24.#25        //  java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #26            //  think/twice/code/once/HelloWorld //类引用
   #6 = Class              #27            //  java/lang/Object //类引用
   #7 = Utf8               <init>          
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               LocalVariableTable
  #12 = Utf8               this
  #13 = Utf8               Lthink/twice/code/once/HelloWorld;
  #14 = Utf8               main
  #15 = Utf8               ([Ljava/lang/String;)V
  #16 = Utf8               args
  #17 = Utf8               [Ljava/lang/String;
  #18 = Utf8               SourceFile
  #19 = Utf8               HelloWorld.java
  #20 = NameAndType        #7:#8          //  "<init>":()V //返回值
  #21 = Class              #28            //  java/lang/System
  #22 = NameAndType        #29:#30        //  out:Ljava/io/PrintStream; 
  #23 = Utf8               Hello World!
  #24 = Class              #31            //  java/io/PrintStream
  #25 = NameAndType        #32:#33        //  println:(Ljava/lang/String;)V
  #26 = Utf8               think/twice/code/once/HelloWorld
  #27 = Utf8               java/lang/Object
  #28 = Utf8               java/lang/System
  #29 = Utf8               out
  #30 = Utf8               Ljava/io/PrintStream;
  #31 = Utf8               java/io/PrintStream
  #32 = Utf8               println
  #33 = Utf8               (Ljava/lang/String;)V

#数字相当于是常量池里的一个索引,例如上面代码段里 #1 代表的是一个方法引用,并且该引用由 #6.#20 构成。

#1 = Methodref          #6.#20         //  java/lang/Object."<init>":()V //方法引用


#6 = Class              #27            //  java/lang/Object //类引用
#27 = Utf8               java/lang/Object


#20 = NameAndType        #7:#8          //  "<init>":()V //返回值
#7 = Utf8               <init>          
#8 = Utf8               ()V

在 JVM 规范中常量类型定义了很多,本次只汇总遇到的几个。

四:构造方法信息

public think.twice.code.once.HelloWorld();
    descriptor: ()V  //方法描述符,这里的V表示void
    flags: ACC_PUBLIC  //权限修饰符
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0       // aload_0 把this装载到了操作数栈中
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return        
      LineNumberTable: //行号表
        line 3: 0      //源代码的第 3 行,0 代表字节码里的 0
      LocalVariableTable:  // 本地变量表
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lthink/twice/code/once/HelloWorld; // 索引为0,变量名称为 this

descriptor:方法入参和返回描述;

flags:访问权限控制符为 public;

stack:方法对应栈帧中的操作数栈的深度为 1;

locals:本地变量数量为 1;

args_size:参数数量为 1;

aload:从局部变量表的相应位置装载一个对象引用到操作数栈的栈顶;

invokespecial:调用一个初始化方法;

LineNumberTable、LocalVariableTable:前者代表行号表,是为调试器提供源码行号与字节码的映射关系;后者代码本地变量表,存放方法的局部变量信息,属于调试信息。

思考一:通过这段字节码信息,印证了一个准则:在没有显示声明构造的情形下,Java 会默认提供无参构造方法。

思考二:虽然是无参构造器,为什么 args_size 的值是 1 呢?是因为无参构造器和非静态方法调用会默认传入 this 变量参数,其中 aload_0 即表示的 this。

五:main 方法的信息

public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String Hello World!
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return        
      LineNumberTable:
        line 5: 0
        line 6: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  args   [Ljava/lang/String;

通过 descriptor 、flags 能直观的能够读懂 main 方法的入参,返回值以及访问修饰符;通过 LocalVariableTable 运行时候的局部变量表,能够看到 main 函数的 args 参数保存在了 LocalVariableTable 中。

3

 解剖:main 方法的运行流程。

重点关注 main 方法中的如下指令(红色圈住部分)

(一)指令 getstatic #2 

表示从索引位置 2 获取静态变量,而 #2 又是引用 #21.#22 构成。

#2 = Fieldref           #21.#22        //  java/lang/System.out:Ljava/io/PrintStream; //字段引用


#21 = Class              #28            //  java/lang/System
#28 = Utf8               java/lang/System


#22 = NameAndType        #29:#30        //  out:Ljava/io/PrintStream;
#29 = Utf8               out
#30 = Utf8               Ljava/io/PrintStream;

兜了一大圈,其实 getstatic #2 指令就是为了拿到输出对象流。

(二)指令 ldc #3 

指令 ldc #3 是把常量压入栈中,#3 对应的是字符串 Hello World。

#3 = String             #23            //  Hello World!
#23 = Utf8               Hello World!

(三)指令 invokevirtual #4

invokevirtual #4 是方法引用,查表过去就是 #24.#25

#4 = Methodref          #24.#25        //  java/io/PrintStream.println:(Ljava/lang/String;)V


#24 = Class              #31            //  java/io/PrintStream
#31 = Utf8               java/io/PrintStream


#25 = NameAndType        #32:#33        //  println:(Ljava/lang/String;)V
#32 = Utf8               println
#33 = Utf8               (Ljava/lang/String;)V

#24 则是类引用 #31 java/io/PrintStream,#25 则是方法 println((Ljava/lang/String;)V) 的引用,这里其实是在执行打印操作。

最后,贴一个字节码里的指令与源代码的一个对应关系图。

4

 寄语写最后 

本次,主要对 Java 字节码有个简单的认识,让大家从字节码角度看看 HelloWorld,看似很容易的入门程序,背后的原理确实不简单。希望通过本次分享,大家对 Java 字节码不再陌生,也希望大家能够学以致用,能够亲自去分析 i++、++i ;字符串拼接效率等诸多场景执行原理。

另外,在 Java 的世界里,有 Java Language Specificatio、Java Virtual Machine Specification 两种规范,直译过来就是 Java 语言规范以及 JVM 规范,本次主要参考 JVM 规范。

闲暇之余,推荐大家多读一读:

https://docs.oracle.com/javase/specs/index.html
https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf

好了,本次就谈到这里,一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!

推荐阅读:

Java线程池深度揭秘

彻底搞懂 Java 线程池,干啥都不再发憷

Java程序跑的快,全要靠线程带

fastjson的这些坑,你误入了没?

真实|技术人员该如何站好最后一班岗?

Java 8 的这些特性,你知道吗?

改掉这些坏习惯,还怕写不出健壮的代码?(一)

改掉这些坏习惯,还怕写不出优雅的代码?(二)

改掉这些坏习惯,还怕写不出优雅的代码?(三)

改掉这些坏习惯,还怕写不出健壮的代码?(四)

改掉这些坏习惯,还怕写不出精简的代码?(五)

改掉这些坏习惯,还怕写不出精简的代码?(六)

<Verilog实现除法器> Verilog实现牛顿-拉夫逊(Newton-Raphson)除法器 阿斯顿阿斯顿啊啊是打发士大夫 阅读详情

相关推荐

深入解析LVDS电平标准在LCD屏接口设计中的关键作用

本文深入解析了LVDS电平标准在LCD屏接口设计中的核心作用。文章不仅阐释了LVDS低电压差分信号的工作原理、关键电气参数及抗噪优势,还详细对比了VESA与JEIDA两种主流数据格式,并提供了从PCB布局布线到信号调试的实战避坑指南,是确保高速、稳定显示的关键技术参考。

weixin_28419039的博客 334

python表白代码-python告白代码,只属于程序员的浪漫

不知何时,不知何因,程序员这个行业成为大家茶余饭后取乐的无辜群体。只要说到程序员,脑海中就浮现出刻板印象,标配穿搭:格子衫,牛仔裤,黑框眼镜。当然秃顶也是必须的,更狠的吐槽还有邋里邋遢,不懂浪漫,不知人情世故!开始可能只是幽默玩笑,后面慢慢就越传越多,大家便信以为真!可是程序员真的是这样吗?随着现在编程这个行业的普遍高薪收入,程序员又成为大家关注的焦点,深入的了解后,发现程序员其实是很可爱的一个群...

q6q6q的专栏 2万+

别再死记硬背了!用LabVIEW串口通信的3个真实项目案例,手把手教你从调试到部署

本文通过3个真实项目案例,详细讲解LabVIEW串口通信从调试到部署的全过程。涵盖Arduino温湿度监控、西门子PLC Modbus通信以及高可靠性通信框架设计,提供实用技巧和常见问题解决方案,帮助工程师快速掌握LabVIEW串口通信的实战应用。

weixin_30485379的博客 523

实现增删改查

实现柜台功能

weixin_71103956的博客 160

新手必看:LiteRadio 2c SE遥控器从开箱到飞行的完整指南(附常见问题解答)

本文为新手提供LiteRadio 2c SE遥控器的完整使用指南,涵盖从开箱到首飞的20个关键步骤。详细介绍了遥控器的功能设置、与无人机的对频技巧以及首飞注意事项,帮助用户快速掌握飞行控制,避免常见错误。特别适合无人机初学者阅读。

weixin_29209801的博客 379

必看!wechat-article-exporter:轻松批量下载公众号文章

微信搜索“”关注公众号。在信息爆炸的时代,我们每天都会接触到大量优秀的微信公众号文章。有时候,我们想要将这些精彩的内容保存下来,以便日后回顾或者分享给更多的人。然而,微信公众号并没有提供直接的批量下载功能,这给我们带来了不少困扰。今天,我要给大家分享一款非常实用的软件——wechat-article-exporter,它能够帮助我们轻松地批量下载微信公众号文章,让你不再为文章的保存而烦恼。

王乐平 技术博客 4351

C语言step-by-step(四)(程序结构)

第4章程序结构 这一章让大家回忆起高中数学的程序框图了,其实我们的程序运行是在程序员的脑海里,程序员想怎么运行就怎么设计,一般我们都是先设计,后实现编码。程序由各种各样的机构组成,程序结构组成了丰富多姿的程序算法…于是,程序结构是一个非常重要的语法知识。C语言程序三大结构:顺序结构、分支结构、循环结构。顺序结构:我们的程序在没有受中断的情况下,会按照顺序执行下来,知道结...

weixin_33850015的博客 610

Hermes 教程 05:多 Agent 编排

本文介绍了Hermes v0.13.0中的四种多Agent协作模式:1)delegate_task快速子任务模式,适合2-3个独立并行任务;2)spawn子Agent模式,实现零成本并行多步流水线;3)tmux交互子Agent模式,支持长期自主任务;4)全新Kanban看板系统,提供持久化AI团队协作框架。各模式在隔离级别、时长、工具访问和适用场景上存在差异,其中spawn模式通过独立上下文窗口实现零上下文成本。文章详细说明了每种模式的使用方法、限制条件和典型应用场景,并提供了具体代码示例和可视化流程图。K

程序猿_三产 534

向正在运行的Linux应用程序注入代码

向正在运行的Linux应用程序注入代码  0x80 @ 系统安全 2012-12-06 共 7468 人围观  小编的话:感谢0×80的认真翻译,辛苦:) ,各位同学,不要吝惜你的顶和评论哦! 原作者:Gregory Shpitalnik 翻译:0×80 1、简介 假设Linux上正在运行某程序,像Unix守护程序等,我们不想终止该程序,但是同时

linuxheik的专栏 1341

AgentScope 2.0 扩展开发完全指南:从中间件到模型适配器的深度实践

本文系统讲解 AgentScope 2.0 框架的五大扩展机制,涵盖中间件系统的洋葱模型与钩子设计、ChatModelBase 基类与多供应商适配器开发、工作空间(本地/Docker/E2B)的抽象接口与生命周期管理、凭据工厂与 MCP 协议集成、以及工具协议与存储后端扩展。文中提供完整的架构图、代码示例与故障排查指南,帮助开发者快速掌握 AgentScope 的插件化扩展体系。

program哲学 295

3D扩散模型的构建与优化:多模态融合在三维物体生成中的作用【附核心代码实例】

随着技术的发展,基于扩散模型的3D内容生成已经成为一个激动人心的领域。通过不断优化扩散模型的结构和算法,结合多模态信息、视角控制和高效网络架构,未来的3D生成技术将不仅能够生成逼真的物体,还能满足虚拟现实、游戏设计、电影制作等行业对高质量、实时生成的需求。

一键难忘的博客 2862

黑马程序员---我脑海中的JAVA大体系

------- android培训、java培训、期待与您交流! ---------- 首先,是JAVA的由来,JAVA是什么?为什么会有JAVA的出现? 这些在总结里都写过了,这里只是大概说一个体系,加深印象。 其次,是基础中的基础,就是大部分编程语言都有的东西,比如: 循环语句,成员变量,局部变量等 然后是一些JAVA和别人不一样的: 关键字,作用域,修饰符,内部类,匿名类

u011400764的专栏 581

【北大核心-代码复现】基于 VMD-FFCM-iTransformer 光伏功率短期预测

【北大核心-代码复现】基于 VMD-FFCM-iTransformer 光伏功率短期预测

765

md5唯一吗_程序员进阶系列:你真的懂 HelloWorld 吗?

作为入了门的 Java 程序员,相信在脑海中都能够秒写出 HelloWorld.java,都知道编译成 HelloWorld.class,然后就可以跨平台执行了。常言道:知人知面不知心。敢问,你真的懂 HelloWorld.class 吗?你真的懂她的内心吗?不清楚,也无所谓,只因有一颗求知的心。先让慌乱的内心平静下来,跟随小猿的脚步,一起从字节码层面看看 HelloWorld。希望通过此篇分享对...

weixin_39640265的博客 289

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

程序员进阶系列:你真的懂 HelloWorld 吗?(转载)

作为入了门的 Java 程序员,相信在脑海中都能够秒写出 HelloWorld.java,都知道编译成 HelloWorld.class,然后就可以跨平台执行了。 常言道:知人知面不知心。敢问,你真的懂 HelloWorld.class 吗?你真的懂她的内心吗? 不清楚,也无所谓,只因有一颗求知的心。 先让慌乱的内心平静下来,跟随小猿的脚步,一起从字节码层面看看 HelloWorld。希望通过此篇分享对字节码文件有个全局的认识,并对 HelloWorld 执行原理有个大致的了解。 1 准备:工欲善其事必先利

shuirenbushijun的博客 263

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

叉叉xsp能反编译吗_程序员进阶系列:你真的懂 HelloWorld 吗?

作为入了门的 Java 程序员,相信在脑海中都能够秒写出 HelloWorld.java,都知道编译成 HelloWorld.class,然后就可以跨平台执行了。常言道:知人知面不知心。敢问,你真的懂 HelloWorld.class 吗?你真的懂她的内心吗?不清楚,也无所谓,只因有一颗求知的心。先让慌乱的内心平静下来,跟随小猿的脚步,一起从字节码层面看看 HelloWorld。希望通过...

weixin_39765325的博客 116

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【必懂C++】第一个程序当然是HelloWorld呀 01

本节内容主要讲解 C++ 中的头文件是什么,cout 的用法,以及 std:: 前缀是什么意思。

1_bit 的博客 4713

有哪些是程序员才懂的梗?

同学们,程序员的梗,看似是调侃、是段子,但背后藏着的是这群人的真实生活。如果你也是程序员,或者正在成为程序员的路上,记住这些梗不仅是笑点,也是你融入圈子的方式。更重要的是,它们告诉我们:生活再难,代码再乱,只要会自嘲,总能找到快乐的出口。所以,当你在社交平台上看到程序员用“Hello World”打招呼时,别觉得奇怪,那只是他们的“职业习惯”而已。程序员界有个“黑话”叫**“删库跑路”**,听着就有点黑社会的意思,但其实这是程序员的职业“恐怖片”。所以,程序员的修仙文化,既是一种吐槽,也是一种无奈。

m0_61562916的博客 1568

你真的懂Java怎么输出Hello World吗?

你真的懂Java怎么输出Hello World吗?1. 你会不会输出"Hello World!"?2. 小生抛砖引玉,欢迎指正3. 总结 1. 你会不会输出"Hello World!"? 当我们学习一门编程语言的时候,我们都会先学如何输出Hello World! ????:“你真的会吗?” ????:“会!” ????:“以下这几个例子,我背都给你背下来!!!!”【骄傲】 C语言 printf("Hello World!"); C++语言 cout << "Hello World!";

Jack·Kwok的博客 41万+

第一个java程序HelloWorld

接上集:java入门教程(一) 转载请注明出处:https://blog.youkuaiyun.com/u014254481/article/details/81943950 一、各类注释:所谓注释,跟我们学习古文时下面的注释作用如出一辙,代码中的注释也是帮我们理解代码的含义,在真正的开发中注释要求写的非常详细和清楚,而写注释的习惯要从一开始养成。(如图1) 1.单行注释:只能跟一行注释内容 //注释...

一入代码深似海 11万+

你真的懂Hello World怎么输出的吗?

但我想说的是,其实看源码的过程正是你学习代码的过程。你可以想想当我们的字符串为null的时候,你会发现输出的是一个字符串的null,而在源码里面正好就是这样的设计。当最小值是一次可以写入最大的长度的时候,我们直接写入最大的长度,这时候初始变量加上写入长度的时候,循环条件是成立的,同时我们也有字符串没有获取,那么将会进入下一次循环,直到b<t不成立时退出。当最小值是我们的字符串长度的时候,我们直接获取字符串的字符数组,让初始变量b加上写入的长度,这个时候我们会发现循环条件已经不成立,那么将会结束循环;

weixin_68009402的博客 178

程序员入门的第一个程序,打印输出 “ HelloWorld “

程序员入门的第一个程序,使用 Java 打印输出 " HelloWorld "

业余幻想家的博客 5676

大牛程序员用Java手写JVM:刚好够运行 HelloWorld

前言 没错这又是一篇介绍 JVM 的文章,这类文章网上已经很多,不同角度、不同深度、不同广度,也都不乏优秀的。为什么还要来一篇?首先对于我来说,我正在学习 Java,了解JVM的实现对学习Java当然很有必要,但我已经做了多年C++开发,就算我用C++实现一个JVM,我还是个C++码农,而用 Java实现,即能学习 Java 语法,又能理解 JVM,一举两得。其次,作为读者,hotspot或者...

QIQI12356的博客 726

致敬伟大的程序员之HelloWorld

伟大的职业,世界进步,为了更美好的世界,致敬程序员

Mike_Linux的博客 1689

SpringBoot入门系列HelloWorld

根据咱们程序员学习的惯例,学习一门新技术都是从HelloWorld开始的。感觉编程是一件非常富有意义的事情,程序员也是一群可爱的人,渴望被关怀和关注,因为我们总在和世界say Hi.好了进入正题 创建项目 首先创建一个项目,可看我上一篇文章写得IntelliJ IDEA创建第一个Spring boot项目接下来运行这个项目,你将会看到如下...

weixin_34409741的博客 74

PHP程序员helloworld,神级程序员10多语言编译‘helloworld’,你又能看懂几种?

helloworld,是我们大学多数程序员入门必学的程序,也是每个人的编程启蒙老师,但是你会几种语言写出helloworld呢,看看下面的十几种,你又能写出几种!跟着小编一起来看!为何要学编程?每个人的动机不一样。大致有:1、为了找个好工作;或为了有更好的机会和更好的发展。2、看到别人超厉害,所以也想学。3、实际工作中很多场合需要。4、从小就立志做个程序员,做软件工程师。5、振兴中国的软件事业。。...

weixin_39992660的博客 143
上一篇: 定位生产问题时,异常堆栈莫名丢了,何解?
下一篇: 程序员进阶系列:年少不懂爱家家,懂了已是猿中人。
一猿小讲
博客等级 码龄15年 294粉丝 156原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值