Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java到C的学习。。。最大的挑战是什么?_Java_C - Fatal编程技术网

从Java到C的学习。。。最大的挑战是什么?

从Java到C的学习。。。最大的挑战是什么?,java,c,Java,C,我有Java方面的经验,由于一些结果,我需要用C编写代码,从Java转换到C有困难吗?这两种语言最大的不同是什么?也许最困难的概念是学习如何自己处理指针和内存管理。Java实质上抽象了许多与指针相关的概念,但在C中,您必须了解指针之间以及与语言中其他概念之间的关系。Java是一个垃圾收集环境,而C不是。C有指针,Java没有。Java方法更经常隐式地使用按引用传递,而C则必须在按引用传递时显式地指示。当然还有很多需要考虑的问题。毫无疑问,首先也是最重要的是,它是手动内存管理 第二,C没有对象,所

我有Java方面的经验,由于一些结果,我需要用C编写代码,从Java转换到C有困难吗?这两种语言最大的不同是什么?

也许最困难的概念是学习如何自己处理指针和内存管理。Java实质上抽象了许多与指针相关的概念,但在C中,您必须了解指针之间以及与语言中其他概念之间的关系。

Java是一个垃圾收集环境,而C不是。C有指针,Java没有。Java方法更经常隐式地使用按引用传递,而C则必须在按引用传递时显式地指示。当然还有很多需要考虑的问题。

毫无疑问,首先也是最重要的是,它是手动内存管理

第二,C没有对象,所以C代码的结构往往与Java代码非常不同

编辑:一个小趣闻:15年前,当PPP还很新的时候,在UNIX命令提示符下登录本地ISP是很常见的,而大学校园里仍然有大量的UNIX服务器的哑终端,很多人都有一个叫做的程序,当我们登录并输出一个随机的极客陈词滥调时,它就会运行。有一天,当我登录一个read时,我真的笑了出来:

C--一种编程语言 结合了组装的力量 语言的灵活性 汇编语言


这很有趣,因为这是真的:C是现代计算的汇编语言。这不是批评,只是观察。

除了指针和内存管理之外,C不是面向对象的语言。您可以组织代码以满足一些基于对象的概念,但您将错过一些功能,如继承、接口和变形。

Java有大量的标准库,而C的库很小。你会发现自己一次又一次地发明各种轮子。即使你正在写你职业生涯中的第十五个链表库,你也可能会犯你以前犯过的同样的错误

C除了数组之外没有标准的容器,几乎没有算法,没有对网络、图形、web任何内容、xml任何内容等的标准访问。您必须真正了解自己在做什么,以免意外调用未定义的行为,导致内存损坏、资源泄漏、崩溃等。这不是为游客准备的


祝你好运。

除了标准C是一种非OO语言、标准库非常小()、手动内存处理的繁琐、完全缺乏线程实用程序(甚至没有多线程意识)、松散的“类型系统”以及为单字节字符集构建之外,我认为最大的概念上的区别是,您必须对对象(或内存块,在C中)的所有权有一个清晰的概念


指定对象的所有权始终是一种很好的做法,但对于非GCed语言来说,这是最重要的。当您将指针传递给另一个函数时,该函数将承担指针的所有权,还是在调用期间从您那里“借用”指针?当您编写一个带有指针参数的函数时,假定指针的所有权对您来说有意义吗?还是指针对象在函数终止后继续存在?

人们已经讨论了其中的主要区别:内存管理、指针、没有奇特的对象(只是简单的结构)。因此,我将列出几件小事:

  • 您必须在代码块的开头声明内容,而不仅仅是在第一次使用它们时
  • 指针、布尔值、整数和几乎任何东西之间的自动类型转换。这是典型的C代码:
    if(!ptr){/*检测到空指针*/}
  • 没有任何意义上的边界检查,允许使用花哨的指针算法。引用超出其范围的内容是明确合法的:
    ptr2=ptr+10;ptr2[-10]++
    相当于
    ptr[0]++
  • 字符串是以零结尾的字符数组。忘记这一点和上一点会导致各种错误和安全漏洞
  • 头应该与实现代码(.h和.c)分开,并且必须通过
    #include
    语句明确地相互引用,避免任何循环依赖关系。有一个预处理器,编译时宏(如
    #include
    s)是该语言的重要组成部分
  • 最后--C有一个
    goto
    语句。但是,如果你用过它,它会从坟墓里爬出来,缠着你

忘了把Java知识应用到C语言上吧。从头开始C语言。它们之间肯定有很多相似之处。操作符基本上是相同的,具有相同的优先级和关联性规则,控制结构几乎相同(除了Java的新型for循环),Java的整体语法基于C,因此我不会说您必须“从头开始”。事实上,搜索“C for Java程序员”可能会帮助你跳过很多你已经知道的东西,比如i++和++i之间的区别。这是一个很有希望的结果:我希望你意识到C和C++甚至C语言都不一样。“GMan,你说得对。不要让语法蒙蔽了你(但它首先有助于编写东西)嗯。。。C看起来更低级。Java方法不使用按引用传递。它们使用传递值,就像在C中一样。区别在于非原语变量包含对对象的引用。“按引用传递”和“按值传递引用”之间有区别。至少Java有一个
NullPointerException
;-)基于C语言的历史,成为汇编语言是非常有意义的。它是为编写Unix而设计的,因此它对cpu进行了严密的建模。