前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >浅谈C、Java与Python之间的小差异

浅谈C、Java与Python之间的小差异

作者头像
小嗷犬
发布于 2022-11-15 07:13:09
发布于 2022-11-15 07:13:09
82300
代码可运行
举报
运行总次数:0
代码可运行

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:浅谈C、Java与Python之间的小差异


本文目录


1.变量是什么

1.1 C认为变量应该是容器

传统的观点通常将变量比喻成容器,不同类型的容器储存不同的物质,就如同不同数据类型的变量存储不同类型的值一样。

人们用杯子装水,用篮子装菜,这一切都是这么正常。

C也是这样认为的,它认为变量就和这些容器一样,int类型的杯子就不能装double类型的菜,float类型的篮子就不能装char类型的水。

它也是这样做的,在C程序中,将不匹配的值赋值给变量是不合法的,这些值有的会被隐式转换,有的干脆就办不了,程序直接撂挑子不干了。

所以C中的变量分别鲜明,各尽其责,所有变量的空间在诞生时就被分配好,未来将要存储的数据也被注定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main()
{
	int a = 10;
	float b = 3.14;
	char c = 'm';
	
	printf("a:%d, b:%f, c:%c", a, b, c);

	return 0;
}

1.2 Python认为变量应该是标签

Python并不认同以往的观点,它觉得传统的观点太刻板了,一个变量的未来不应该在它诞生之际就被限定死了,如同印度的种姓制度一样。

Python主张各变量之间的平等,变量可以存储任何类型的数据,Python也确实是这么做的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = 10
print(a)

a = 3.14
print(a)

a = "Hello World!"
print(a)

但一旦认为是变量存储数据后,存储空间的分配又成了困扰Python的难题,一向平等的它不知道该按照什么标准去分配空间,变量们将要存储的数据类型还未可知,如果现在平均分配空间必然会导致今后的一些问题。

Python冥思苦想,终于有一天它想出了一个神奇的构想,它不必将数据需要的空间分配给变量,它只用给变量留足存储自己的空间,而数据则单独找它认领空间,然后将数据空间的地址交给变量保管。这样一个完全不一样的分配制度和所有制度就出现了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// C中的空间地址是与变量绑定的
#include <stdio.h>

int main()
{
	int a = 10;
	int b = 10;
	printf("int型变量a的值为%d,地址为%p\n", a, &a);
	printf("int型变量b的值为%d,地址为%p\n", b, &b);

	a += 10;
	b += 10;
	printf("变化后变量a的值为%d,地址为%p\n", a, &a);
	printf("变化后变量b的值为%d,地址为%p\n", b, &b);

	return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Python中的空间地址是与值绑定的
a = 10
b = 10
print(f"变量a的值为{a},地址为{id(a)}")
print(f"变量b的值为{b},地址为{id(b)}")

a += 10
b += 10
print(f"变化后变量a的值为{a},地址为{id(a)}")
print(f"变化后变量b的值为{b},地址为{id(b)}")

1.3 Java认为我们不应该关心这个问题

Java打造了一台功能强大的虚拟机,即所谓的JVM,来帮我们解决包括存储空间分配在内的内存管理问题,涉及到内存的操作都由JVM来完成,程序员不用也不能直接操作内存。

Java担心我们不能合理分配利用空间,所以它用自己的方法解决了这个问题。


2.循环与迭代

2.1 传统的循环

C是三者中最年长的语言,它的循环也很具有代表性,循环结构是用来处理一系列相似的事物的,这种重复劳动是十分无趣的,所以C通常是数着数来统计重复的次数,然后看看什么时候能下班。

它使用一种自增运算来数数,用一个整型变量来存储次数,为了方便逐个的自增,它发明了i++和++i这种结构来简化命令,这样的运算也被后来的许多语言效仿。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main()
{
	for (int i = 0; i < 10; i++)//经典的i++自增
	{
		printf("%d\n", i);
	}

	return 0;
}

2.2 继承与发展

Java也是一位比较老的语言,但它的资历没有C老,自身习惯上也受到C很大的影响,循环就是其中之一,C语言中的循环在它这里也能使用。

但它后来就发现了问题,传统的循环要在知道该重复多少次的时候才能按时结束,对于成堆的任务,Java有时候很难事先知道它们有多少。

Java后来发现,是它考虑的太多了,它根本没必要知道要做多少,甚至没必要统计自己现在做了多少了,对于固定量的任务,它只要让循环把它们都做完就行了,没有做完就继续做,做完了就可以提前下班。

于是Java规定了一个新的循环规则,即迭代循环。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Main {
    public static void main(String[] args) {
        int[] numbers = { 5, 3, 8, 4, 6, 1, 7, 2 };
        //迭代循环
        for (int item : numbers) {
            System.out.println(item);
        }
    }
}

这样的循环似乎并不比传统循环更难使用,但那时候的大多数语言还是以传统循环为主,包括我们的Java。


2.3 新的问题

在其他语言使用传统循环解决问题时,Python似乎有点愁眉苦脸,它又遇到了新的问题。

在之前对变量处理中,Python选择为值分配内存空间,而不是传统的只为变量分配空间。在进行重复工作时,工作的计数器会不断产生新的值,Python要为这些产生的新值都分配空间,在少量的重复工作时,Python感觉还能吃得消,但量级一大,Python就没有这么多空间可以分配了。

按照这种分配方式,计数器的每一次++自增都会产生一个新值,都需要为它分配内存空间,如果循环重复100次,它就要消耗100个数据单位的空间,如果重复1000次呢?10000次呢?Python不敢往下想了,问题迫在眉睫。

Python翻阅古籍,终于找到了以前Java发明的一种不同的循环方式,这就是它要找的解决问题的答案。它发明了一个迭代器range来取代之前的自增计数器,迭代器里的数只有在取用的时候才占据内存,使用完将会在循环结束后释放,这样一来就能解决内存空间的问题了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Python迭代循环打印09
for i in range(10):
    print(i)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// C语言传统循环打印0到9
#include <stdio.h>

int main()
{
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", i);
	}

	return 0;
}

实验结果正如同Python想的那样,内存空间的无谓损失被降低了。 为了推广这个新的循环方式,它禁用了传统循环,并废除了i++或是++i自增的用法,鼓励大家使用迭代器range搭配新的循环。


3.尾声

3.1 万物皆对象

三者中最先提到类与对象这个概念的是我们的Java,它认为万物皆是类,包括它自己,从此面向对象编程横空出世,但它还要兼容传统的思想,对此它的JVM对传统的基本数据类型和新的类对象做了不同处理。

对于传统的基本数据类型,JVM将其存在栈中,而将实例化的对象存在堆中。在函数调用时,对于简单的基本数据类型,JVM进行值传递,而对于复杂的对象则采用引用传递。

相应的变量在相互赋值的时候,有的对象会不幸失去引用,如果没有变量引用它,它将变得无法操作,它的存在将没有意义。Java很贴心地安排了JVM去回收它们,这样的回收系统同样也可以用来回收那些不会再被用到的数据。

虽然看起来Java对它们有些不尽人情,用完不需要别人了就回收,但这一切都是为了计算机更好的执行任务。


3.2 C的自增

为了更好的适应新的任务,C也学着Java加入了类与对象的功能,C实现了自身的进化,进化成了C++,它在利用类与对象的便利的同时,并不承认万物皆对象的观点,这也让它保存了C那时面向过程编程的风格。

C++封装了许多常用类来方便我们工作,同时允许我们直接操作内存,没有像JVM虚拟机那样的阻隔,保持着C语言原有的高速,同时更加接近底层。


3.3 Python的好名声

Python是三者中诞生最晚的,它最开始是没有什么知名度的,在C与Java面前只能老老实实当小弟。但年轻人还是不一样,它敢想敢做,首先是实现了各变量之间的平等,让它们能够存储任意数据,然后解决了内存空间的相关问题。

除此之外,它开源自己,广泛吸取大家的意见,Python逐渐变得知名了。

在这些过程中,Python不断改善自身,变得十分人性化,简单的语法、便捷的方法,都吸引着其他程序员去了解,程序员们也能很容易的入门。

现在,Python除了自带的标准库外,支持导入很多的外部库,大大地拓展了Python的应用范围。这一切都仰仗它一直以来的好名声,使得不断有人前赴后继贡献自己的便捷方法,为其编写外部库。

现在Python虽然没有C/C++那样的速度,但是它的便捷性已经不输其他老一辈的语言了,程序员们在写小程序的时候会更加青睐它。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
在 C/C++/Java 等等语言中,整型变量的自增或自减操作是标配,它们又可分为前缀操作(++i 和 --i)与后缀操作(i++ 和 i--),彼此存在着一些细微差别,各有不同的用途。
Python猫
2020/06/23
1.7K0
C++入门知识(二)
用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。
海盗船长
2020/08/27
5420
Java基础篇 | 初始面向对象
不知道小伙伴发现问题没有,其实这两者方式虽然都能实现,但确是漏洞百出,接下来我们一点一点分析。
程序员Leo
2023/11/16
1950
Java基础篇 | 初始面向对象
Python的内存管理机制
任何编程语言都会有一个内存模型,以便管理为变量分配的内存空间。不同的编程语言,如C、C++、Java、C#,Python,它们的内存模型都是不相同的,本文将以现在最流行的Python语言为例,来说明动态类型语言的内存管理方式。
蒙娜丽宁
2020/04/13
1.2K0
C语言的灵魂——指针
相关视频——强烈推荐【强烈推荐】4小时彻底掌握C指针 - 顶尖程序员图文讲解 - UP主亲自翻译校对 (已完结)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
半生瓜的blog
2023/05/12
9570
C语言的灵魂——指针
Python与C++、Java区别对比学习
Java 的数组和变量在存储上是有区别的。在 Java 中,变量是一种基本的数据结构,用于存储单个值。而数组则是一种复合数据类型,用于存储一系列相同类型的值。
CtrlX
2023/03/21
2.2K0
Python与C++、Java区别对比学习
嵌入式软件工程师笔试面试指南-C/C++
哈喽,大家好。最近几天,我把去年秋招总结的笔试面试的一些内容,又进行了重新规划分类。详细分成了简历书写,面试技巧,面经总结,笔试面试八股文总结等四个部分。
嵌入式与Linux那些事
2021/04/15
1.7K0
嵌入式软件工程师笔试面试指南-C/C++
浅谈C/C++中的指针和数组(一)
                                                       浅谈C/C++中的指针和数组(一)       指针是C/C++的精华,而指针和数组又是一对欢喜冤家,很多时候我们并不能很好的区分指针和数组,对于刚毕业的计算机系的本科生很少有人能够熟练掌握指针以及数组的用法和区别。造成这种原因可能跟现在大学教学以及现在市面上流行的很多C或者C++教程有关,这些教程虽然通俗易懂,但是在很多关键性的地方却避而不谈或者根本阐述不清楚,甚至很多时候阐述的是错误的观点。一般
猿人谷
2018/01/17
8750
浅谈C/C++中的指针和数组(一)
提高Python性能的一些建议
    最近换住的地方,网费到期,有两个星期没更新博客了,博客还是要坚持写的,有时候工作时遇到了相关问题,查看相关博客,还是能够得到一些思路或者灵感。虽然写篇博客要话费不少时间(我一般要花一个半小时到两个小时之间),但是这中间码字呀、归纳总结的过程还是让我受益匪浅的,温故而知新!当然分享自己的学习心得,也会让自己认识一些志同道合的朋友,也挺好。不说许多,今天讲讲如何提高Python性能的问题。
py3study
2020/01/08
4870
Java基础全面解析——Java语言基础
高级编程语言的组成:关键字、标识符、注释、常量与变量、语句、函数、数组,下面一一介绍各个组成元素。 a)  关键字 i.  定义:关键字是一些英文单词,但在java中有特殊含义,自定义的变量不能和关键字重名。 ii.注:关键字一般都小写。 b)  标识符 i.  定义:标识符就是自定义的变量名 ii.规则:26个字母大小写、0-9、_、$组成 iii.注1:不能以数字开头 iv.注2:不能含有关键字 c)  注释 i.  注释在编译时全被删除。 ii.作用:注解程序和调试程序。 iii.    注释能用JD
大闲人柴毛毛
2018/03/09
1.1K0
程序员C语言快速上手——高级篇(十)
为什么需要在堆上面分配动态内存?在前面的章节中,我们一直使用自动内存,也就是栈内存,这并不影响C程序的编写,那么我们为什么还要去使用动态内存,而且还要很麻烦的去手动管理动态内存呢?
arcticfox
2019/07/26
1.4K0
整理了70道C语言与C++常见问答题
变量的定义为变量分配地址和存储空间, 变量的声明不分配地址。一个变量可以在多个地方声明, 但是只在一个地方定义。 加入extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。
C语言与CPP编程
2021/02/07
3.1K0
整理了70道C语言与C++常见问答题
Python(一)
本系列是个人学习 Python 的学习笔记。董付国编著的 Python 程序设计(第三版)
赤蓝紫
2023/01/01
6530
Python(一)
Java程序设计(Java9版):第4章 简单复合类型
第4章 简单复合类型 4.1 数组 在C语言中,数据类型除了基本数据类型之外,还存在着大量复合数据类型。数组就是一类最简单且非常重要的复合数据类型,数组是具有相同类型变量的顺序存储的集合。几乎所有的程
程裕强
2018/01/02
1.2K0
Java开发,内存泄漏不会排查,这下糗大了
在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC(Garbage Collection垃圾回收),这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。
架构师修炼
2021/06/25
5330
Java开发,内存泄漏不会排查,这下糗大了
Java内存管理-你真的理解Java中的数据类型吗(十)
0、Java的线程安全、单例模式、JVM内存结构等知识梳理 1、Java内存管理-程序运行过程(一) 2、Java内存管理-初始JVM和JVM启动流程(二) 3、Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三) 4、Java内存管理-掌握虚拟机类加载机制(四) 5、Java内存管理-掌握虚拟机类加载器(五) 6、Java内存管理-类加载器的核心源码和设计模式(六) 7、Java内存管理-掌握自定义类加载器的实现(七) 第一季总结:由浅入深JAVA内存管理 Core Story
用户7886150
2020/12/11
5210
看完这篇你还能不懂C语言/C++内存管理?
C 语言内存管理指对系统内存的分配、创建、使用这一系列操作。在内存管理中,由于是操作系统内存,使用不当会造成毕竟麻烦的结果。本文将从系统内存的分配、创建出发,并且使用例子来举例说明内存管理不当会出现的情况及解决办法。
C语言与CPP编程
2020/12/02
5800
看完这篇你还能不懂C语言/C++内存管理?
Java数组的使用
推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。 https://www.captainbed.cn/f1
鲜于言悠
2024/05/26
590
Java数组的使用
熬夜整理的万字C/C++总结(一),值得收藏
贝尔实验室的Dennis Ritchie在1972年开发了C,当时他正与ken Thompson一起设计UNIX操作系统,然而,C并不是完全由Ritchie构想出来的。它来自Thompson的B语言。
C语言与CPP编程
2021/08/01
4730
熬夜整理的万字C/C++总结(一),值得收藏
C语言入门
人与人之间交流需要通过语言,我们中国人之间交流用普通话,英国人用英语,俄国人用俄语等。
小颜同学
2023/08/21
8940
相关推荐
Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验