从Java到C的学习。。。最大的挑战是什么? 1 周,5 日 Questions & Answers 286 我有Java方面的经验,由于一些结果,我需要用C编写代码,从Java切换到C有困难吗?这两种语言最大的不同是什么
# 1 楼答案 毫无疑问,首先也是最重要的是,它是手动内存管理 其次,C没有对象,所以C代码的结构往往与Java代码非常不同 编辑:一个小故事:15年前,当PPP还很新的时候,在UNIX命令提示符下登录到您当地的ISP是很常见的,而大学校园里仍然有很多UNIX服务器的哑终端,许多人有一个名为fortune的程序,当我们登录并输出一个随机的极客陈词滥调时,该程序就会运行。有一天,当我登录阅读时,我真的大笑起来: C -- a programming language that combines the power of assembly language with the flexibility of assembly language. 这很有趣,因为这是真的:C是现代计算的汇编语言。这不是批评,只是观察
# 3 楼答案 人们已经讨论了它们之间的巨大差异:内存管理、指针、没有奇特的对象(只有简单的结构)。因此,我将列出几件小事: 您必须在代码块的开头声明内容,而不仅仅是在第一次使用它们时 指针、布尔值、整数和几乎任何东西之间的自动类型转换。这是典型的C代码:if (!ptr) { /* null pointer detected */ } 没有任何意义上的边界检查,也不允许使用花哨的指针算法。引用边界之外的事物是明确合法的:ptr2 = ptr + 10; ptr2[-10] ++;相当于ptr[0] ++李> 字符串是以零结尾的字符数组。忘记这一点和前一点会导致各种错误和安全漏洞李> 头应该与实现代码(.h和.c)分开,并且必须通过#include语句显式地相互引用,避免任何循环依赖关系。有一个预处理器,编译时宏(如#include)是语言的重要组成部分李> 最后--C有一个goto语句。但是,如果你用过它,Dijkstra会从坟墓里爬出来,困扰你李>
# 4 楼答案 除了标准C是一种非OO语言、标准库非常小(and in some places, just plain bad)、手动内存处理的繁琐、完全缺乏线程实用程序(甚至没有多线程意识)、松散的“类型系统”以及为单字节字符集构建,我认为最大的概念差异是,你必须对对象(或内存块,在C语言中)的所有权有一个清晰的概念 指定对象的所有权始终是一种很好的做法,但对于非GCed语言来说,这是至关重要的。当您将指针传递给另一个函数时,该函数将承担指针的所有权,还是在调用期间从您那里“借用”指针?当你编写一个带有指针参数的函数时,假设指针的所有权对你来说有意义吗?还是指针对象在函数终止后继续存在
# 6 楼答案 Java有一个庞大的标准库,而C则很小。你会发现自己一次又一次地发明各种轮子。即使你正在写你职业生涯中的第十五个链表库,你也可能会犯同样的错误 除了数组,C没有标准的容器,几乎没有算法,没有对网络、图形、web任何内容、xml任何内容等的标准访问。你必须真正知道自己在做什么,以免意外地调用未定义的行为,导致内存损坏、资源泄漏、崩溃等。这不是为游客准备的 祝你好运
# 1 楼答案
毫无疑问,首先也是最重要的是,它是手动内存管理
其次,C没有对象,所以C代码的结构往往与Java代码非常不同
编辑:一个小故事:15年前,当PPP还很新的时候,在UNIX命令提示符下登录到您当地的ISP是很常见的,而大学校园里仍然有很多UNIX服务器的哑终端,许多人有一个名为fortune的程序,当我们登录并输出一个随机的极客陈词滥调时,该程序就会运行。有一天,当我登录阅读时,我真的大笑起来:
这很有趣,因为这是真的:C是现代计算的汇编语言。这不是批评,只是观察
# 2 楼答案
也许最困难的概念是学习如何自己处理指针和内存管理。Java实质上抽象了许多与指针相关的概念,但在C中,您必须理解指针之间以及与语言中其他概念之间的关系
# 3 楼答案
人们已经讨论了它们之间的巨大差异:内存管理、指针、没有奇特的对象(只有简单的结构)。因此,我将列出几件小事:
if (!ptr) { /* null pointer detected */ }
ptr2 = ptr + 10; ptr2[-10] ++;
相当于ptr[0] ++
李>#include
语句显式地相互引用,避免任何循环依赖关系。有一个预处理器,编译时宏(如#include
)是语言的重要组成部分李>goto
语句。但是,如果你用过它,Dijkstra会从坟墓里爬出来,困扰你李># 4 楼答案
除了标准C是一种非OO语言、标准库非常小(and in some places, just plain bad)、手动内存处理的繁琐、完全缺乏线程实用程序(甚至没有多线程意识)、松散的“类型系统”以及为单字节字符集构建,我认为最大的概念差异是,你必须对对象(或内存块,在C语言中)的所有权有一个清晰的概念
指定对象的所有权始终是一种很好的做法,但对于非GCed语言来说,这是至关重要的。当您将指针传递给另一个函数时,该函数将承担指针的所有权,还是在调用期间从您那里“借用”指针?当你编写一个带有指针参数的函数时,假设指针的所有权对你来说有意义吗?还是指针对象在函数终止后继续存在
# 5 楼答案
除了指针和内存管理,C不是一种面向对象的语言。您可以组织代码以满足一些基于对象的概念,但您将错过一些特性,如继承、接口和变形
# 6 楼答案
Java有一个庞大的标准库,而C则很小。你会发现自己一次又一次地发明各种轮子。即使你正在写你职业生涯中的第十五个链表库,你也可能会犯同样的错误
除了数组,C没有标准的容器,几乎没有算法,没有对网络、图形、web任何内容、xml任何内容等的标准访问。你必须真正知道自己在做什么,以免意外地调用未定义的行为,导致内存损坏、资源泄漏、崩溃等。这不是为游客准备的
祝你好运