从学习角度上说,很多人认为C语言单纯简单,其实比Java要容易。我认为,如果要把本质学懂,确实如此,而且在学懂C语言的基础上再学Java的人往往会获得很好的效果。
Java中由于隐藏了内存分配的处理,反而不如C语言在内存管理上来的直观。从应用角度上说,还是Java要容易很多的。这主要体现在以下几个方面。
内存管理
C语言需要自己申请内存,自己归还内存,总之什么事儿都得自己操心。你得记得自己在哪里借了内存,还得搞清楚自己现在这个指针是指向Stack里的内存还是Heap里的,Stack里的还得记得啥时候作用域没了……总之,要特别小心,一个失误就功亏一篑了。
而Java的内存管理,有了垃圾回收这个大妈帮着管了,你就只管借不用管还了。用完了往门口一扔,到时候自己就有人来拿回去了。
应用库
C语言相关的应用库也不能说不多,但比较杂,而且由于C语言的应用领域跟Java本身就不一样,所具有的应用库也不同。从提问者的说明来看,主要是指Web开发。那么要用C语言写一款应用服务器的话,通常可能要自己来学习HTTP协议、XML/JSON解析、还要自己研究内部的路径路由……总之一大堆破事儿等着处理。
Java在这方面优势要明显很多。JavaEE,Struts2,Hibernate,Spring等等都是现成的框架,只需要按照框架规定填写业务逻辑就好了。解析HTTP协议之类的底层处理,框架都做了。所以C语言不学这些,只是没用C语言做Web应用罢了。如果做,要学的知识会成倍增长的。
跨平台
C语言是不具有二进制级别的跨平台性的。和我们在Linux上使用C语言和在Windows上使用C语言时,所用到的编译器不同,涉及到与系统相关的调用,涉及到的函数、数据结构都会不同。这让C语言在跨平台开发的时候工作量成倍增加。不仅仅是跨操作系统,即便是同一种操作系统,总线位数不同,也会影响C语言的表现。早期电脑都是16bit的操作系统(当然更早期还有8bit等更古董的),后来普及了32bit,现在基本都过渡到了64bit。每次升级,都可能让很多当年设计的不是很好的C语言代码完蛋。
Java语言自诞生之日起就以跨平台为宣传口号。虽然实际效果没有宣传的那么美好,但也确实大大降低了开发工作量。虽然随之而来的性能问题也一直被各方面诟病。在跨平台上,Java的优势极其明显。
规则
C语言的规则相对简单,规矩相对少。而这恰恰加大了使用难度。
围棋和象棋比较,围棋的规则相对简单,就两种棋子,棋盘上哪里都可以放子,一片子没有气就死了。虽然为了解决争议还有例如打劫之类的规则,但比起象棋兵种众多,每个兵种移动方式还不同,遇上国际象棋那种同一个兵种走路和杀人的时候步法还有差异的,动不动老王跟城堡就瞬间移动一下的规则,围棋的规则不可谓不简单。然而,AI在象棋上战胜人类是在1997年,AI在围棋上战胜人类是在去年?我觉得是否真的战胜了可能目前还有争议。足可见两者难度的差异。
C语言和Java也是类似的,越是规则简单的C语言越是难以掌握。
综上来看,C语言在使用上的难度要大大高于Java。在学习时,因为计算机是一门使用科学,如果学了不会用,基本等于没学,所以最终还是会落到使用难度上,如果要学到能做出同类东西的水平,自然是C语言难度要大一些了。