【另眼看编程】(一)什么是变量?为什么要使用变量?

本文解释了变量在编程中的作用,从基本概念到实际应用,包括如何在内存中存储和检索数据,以及变量类型的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本来打算写在空间好统一整理的,应大家要求,现在发到战地日记里吧。
------------------------
说到学习编程啊,首先要学习的,肯定就是变量了,因为变量是一切代码的基础。
一、变量是什么?
变量变量,说白了就是会变的量,有些同学不理解什么是变量,为什么要声明变量,声明变量有什么用。下面我就打一些比方来说明什么是变量。
首先,要理解,编程是什么。编程,就是我们告诉计算机,你要帮我做什么。在这个过程中,有人、编程语言 、计算机三个角色,因为计算机是看不懂人类的语言的,而我们也无法直接地告诉计算机要做什么,所以我们要通过我们的“助理”,PHP美女帮我们做这件事。
比如说,我要告诉计算机,你帮我输出“兄弟连威武”这几个字,那么,我们就通过PHP的“echo”函数,告诉计算机,你要输出这个东西。
前面说了这么多废话,其实就是为了说明为什么要使用变量。
学过计算机基础的同学(没学过的自己买书学一下)应该都知道,计算机在工作过程中所产生的所有数据,都是在“内存”中存储和读取的。大家可以把“内存”想象成一个工厂的仓库,数据呢就是这个工厂工作过程中要使用的“零件”。在一段程序中,有很多很多的数据(零件),它们分别存放在内存(仓库)中的不同地方,比如生产一辆自行车,我们需要用到”车轮“、”车把“、“踏脚”、”链条“、”车架“等等各种零件,而这些零件分别存放在仓库(内存)的不同位置,我们的自行车厂请了个美女助理,她叫”PHP“,PHP美女呢,是个可爱的萝莉。她很聪明,但是有时候她也很笨。
我们想让她分别去不同的仓库取出这些零件,我们就得告诉她,这些零件分别存放在几号库,几号柜,比如”库01柜03“存放的是车轮。而在计算机编程里,这个编号就是传说中的” 变量“,只不过编程里不提倡用中文,所以呢用编程的表示方法就是”$k01g03=wheel(车轮)“,中间的”=“叫作赋值运算符,它的作用就是把”$k01g03“这个标签”帖“到”wheel(车轮上)“。
所以总结性地说:
作为程序寻找内存中所存放的数据时的一个标签,它的作用是告诉程序,你应该去内存中的哪个地方寻找接下来要用到的数据。
那么这些内存中的数据,也可以理解成仓库里的零件,是谁放进去的,什么时候放进去的呢?这个过程,就是在程序执行到 声明变量的语句或者 变量赋值的时候实现的。比如:
$a = 1;
$b = 2;
在这两句代码执行的时候,首先会在内存(仓库)中产生两个”零件“,分别是1和2,然后在“零件入库表”中登记,1这个零件是存放在$a这个仓库里,而2呢就是放在$b这个仓库里,那么在接下来的程序中要用到这两个零件的时候,程序就会在内存中相应的位置调这两个零件出来用,比如下面的这段代码:
$a + $b;
这个时候呢,程序就会在仓库(内存)中编号为$1的地方调用相应的零件(数据),而这个零件(数据)就是1,同理,$2调出来的是2,那么在执行$a + $b的时候,就会进行1+2的运算。变量的作用,就是可以让我们在程序中任意地方很方便地调用我们想要用到的数据,就像上面的1和2,在后面的代码中,我们只要简单地调用$1和$2即可,不需要重复地写1或者2.
在上面的公式中,“+”号是一个运算符,大家可以把它想像成一个工厂里的“机器”,它的作用就是进行加法运算,关于运算符的详细用法,将会在后面的文章中详细讲解。
大家也许会觉得奇怪,1和2这么简单的数据,有存在内存(仓库)里的必要吗?没错,对于这种简单的数据,看起来像是没必要的。但是,如果我们要在程序中重复使用23094387249这样的复杂数据时,我们就很有必要把它存进“仓库”里,给它编上编号,这样我们就可以通过一个简单的”编号“(变量名)对它进行反复的调用。

其实变量真正的工作原理比这个复杂很多,工作模式也没有这么简单。上面说的这些,只是为了方便那些对变量的概念没有理解的同学理一理思路,知道变量是做什么的,为什么要用变量。其实在初学编程时,能跟上老师的节奏,理解这些概念并知道怎么使用、为什么要这么用就可以了,想要真正研究底层的原理,是要一定功夫的。建议没有编程功底的同学不要太深入研究这个,只要知道怎么用变量就可以了。

----------------------
PS:同学们要是有什么疑问,可以跟帖提出,我会抽时间为大家解答,或者有哪位能回答的兄弟也可以帮忙解答,互相学习互相进步嘛。

下集预告:
什么是变量类型?为什么变量要分类型?
原文地址: http://bbs.lampbrother.net/read-htm-tid-122388.html
阅读(49) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
<think>嗯,用户问为什么C#和Java在创建对象的时候要用new这个关键字,看起来有点多余。这个问题需要从编程语言设计的角度来解释。首先,我得回忆下new在这些语言中的作用。在C#和Java中,new用来实例化个对象,也就是分配内存并调用构造函数。那为什么选择用new而不是其他方式呢? 可能的原因是历史沿袭。C++也使用new来动态分配内存,而Java和C#都受到了C++的影响。虽然C++中的new是用来在堆上分配内存的,而Java和C#中的对象总是在堆上分配的,但设计者可能保留了new关键字来明确对象创建的意图。不过,在C++中,如果你在栈上创建对象,可以直接声明而不需要new,而Java和C#没有这种栈对象的区分,所有对象都是堆上的,所以必须用new。 个角度是语法清晰性。使用new关键字可以让代码阅读者眼看出这里是在创建新对象,而不是调用方法或访问静态成员。比如,假设有个类叫做Car,当你写Car myCar = Car();的时候,如果没有new,可能会和调用个返回Car实例的静态方法混淆,而Car.create()这样的方法也可能存在。使用new Car()就明确表示要构造个新实例。 还有内存管理的考虑。在Java和C#中,new不仅分配内存,还负责调用构造函数进行初始化。这个关键字的存在可能帮助开发者明确内存分配的发生点,尤其是在有垃圾回收的系统中,虽然开发者不需要手动释放内存,但知道对象何时被创建还是很重要的。 不过用户可能觉得多余,可能来自其他语言的比较。比如Python中创建对象直接是ClassName(),不需要new。JavaScript虽然也有new,但ES6之后可以通过类语法糖来使用更简洁的方式,不过底层还是需要new。可能用户接触过这些语言,所以觉得Java和C#的new有点多余。 那需要解释为什么这些语言的设计者选择保留new。可能是因为显式优于隐式的哲学,Java和C#强调代码的明确性和减少歧义。例如,在Java中,方法名通常以小写字母开头,而类名以大写字母开头,这样new ClassName()的写法可以避免混淆构造函数调用和普通方法调用。 外,构造函数和普通方法的区别。在Java和C#中,构造函数必须与类同名,并且没有返回类型。使用new关键字可以明确地指示调用的是构造函数,而不是其他方法。如果没有new,像ClassName()这样的语法可能被误解为调用个名为ClassName的方法,尤其是当类中存在这样的静态方法时。 比如,假设有个类Car,里面有个静态方法Car(),返回个实例。如果没有new,Car car = Car() 就可能被理解为调用静态方法,而使用new Car()则明确是调用构造函数。这样可以避免歧义,增强代码的可读性和可维护性。 还有可能涉及语言的致性。在Java和C#中,数组的创建也需要new,比如int[] arr = new int[5];,保持关键字的致性有助于降低学习成本,使语法更统外,从语言设计的角度来看,使用new关键字可能在编译阶段帮助解析器更容易区分对象创建和其他表达式,简化语法分析。比如,当编译器看到new关键字时,就知道接下来要处理的是对象实例化,从而采取相应的解析规则。 用户可能还疑惑,为什么像值类型在C#中可以不使用new,比如int num = 5;,但如果是结构体的实例化呢?比如DateTime。实际上,结构体在C#中可以使用new来调用构造函数,但也可以直接赋值字段(如果允许的话)。但类必须使用new,这可能是因为结构体是值类型,而类是引用类型,两者的内存分配方式不同,但设计上仍然保持定的致性。 总结起来,主要原因可能包括:历史原因继承自C++,语法明确性以避免歧义,强调对象创建的显式操作,与构造函数调用的区分,保持语言语法的致性,以及帮助编译器的解析。需要把这些点组织起来,用用户能理解的语言解释清楚,同时回应他们觉得“多余”的感受,说明设计背后的权衡和考虑。</think>在 C# 和 Java 中,使用 `new` 关键字创建对象并非“多余”,而是语言设计者为了代码的**明确性**、**致性**和**安全性**做出的重要选择。以下是具体原因: --- ### 1. **明确区分「对象创建」与「方法调用」** - **语法无歧义**:`new` 关键字直接表明“此处正在创建个新对象”。例如: ```java Car myCar = new Car(); // 明确是对象实例化 Car.factory(); // 明显是静态方法调用 ``` - **避免混淆**:假设没有 `new`,`Car()` 可能与类中的静态方法 `Car()` 或构造函数混淆(尤其在代码复杂时)。使用 `new` 强制语法上区分这两者。 --- ### 2. **内存管理的显式标记** - **堆内存分配的提醒**:在 Java 和 C# 中,对象默认在堆(Heap)上分配内存。`new` 提醒开发者这是个潜在“昂贵”的操作(涉及内存分配和垃圾回收)。 - **值类型 vs 引用类型**(C# 特有):C# 中值类型(如 `int`)可以直接赋值,但引用类型必须用 `new`,以此区分两者的内存行为。 --- ### 3. **构造函数的专用调用符号** - **构造函数特殊性**:构造函数是种特殊方法,负责对象初始化。`new` 关键字是调用构造函数的唯方式,与其他普通方法形成鲜明对比。 - **强制初始化逻辑**:通过 `new` 确保对象必须经过构造函数初始化,避免未初始化的“脏对象”。 --- ### 4. **历史继承与语言致性** - **C++ 的影响**:Java 和 C# 的设计参考了 C++,而 C++ 用 `new` 在堆上分配对象。尽管 Java/C# 隐藏了指针细节,但仍保留了 `new` 作为对象创建的标志。 - **语法统性**:`new` 不仅用于对象,还用于数组(如 `new int[5]`),保持语法致性。 --- ### 5. **与其他语言的对比** - **Python/JavaScript 的灵活性**:Python 直接写 `MyClass()`,JavaScript 的 `new` 是可选的(ES6 类强制使用)。但 Java/C# 更强调**强类型**和**编译时检查**,`new` 能帮助编译器提前发现错误(如误用未初始化的变量)。 --- ### 用户可能觉得“多余”的原因 如果你觉得 `new` 多余,可能是因为: - **接触过动态类型语言**(如 Python):这些语言更依赖约定而非强制语法。 - **现代语言的简化趋势**:如 Kotlin 允许 `val list = ArrayList<String>()` 省略 `new`,但这是在语言设计后期对简洁性的改进。 --- ### 总结 `new` 的存在的核心逻辑是:**通过显式标记对象创建,提升代码可读性、安全性和致性**。尽管看似多了个符号,但它避免了大量潜在歧义和错误,是静态类型语言设计中的经典权衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值