`
icheng
  • 浏览: 829767 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

从C++到JAVA,C++程序员学习JAVA的指南(2)

 
阅读更多

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

讨论新闻组及文件

Technorati 标签: JAVA,C++,Python

JAVA is not just another programming language. -- 匿名

学习更新的语言,有助于了解别人对旧语言有哪些不满。 -- 匿名

前言

先说明本文的行文习惯,文章写作流程以本人阅读《Java Programming Language》为顺序,一般以一个本人认为值得讲的JAVA与C++不同的特性为一个小节,每小节尽量以JAVA的新特性为标题,首先对比C++,JAVA,Python三者在此上的区别,然后展开讨论。因为没有人能够在每个领域都成为专家,本人也是Python知识浅薄,并且新学JAVA,C++也不过学了2,3年,以此学习方式纯粹为了对比学习,没有厚此薄彼之意。虽然本人常常几书在手,时常查阅,但是文中技术的硬伤因为本人的水平也就这样,估计难以避免,也请大家指正。

1.原生整数类型的大小确定

C++ -- 类型大小一般规定最小值,整数类型丰富

JAVA -- 完全由标准定死原生整数类型的大小,整数类型丰富

Python -- 整数仅分标准整形和长整形,标准整形长度不确定,长整形

JAVA的这个特点不算是太大的改动,但是比起C++来说实在是更为方便。C++继承了C的传统,标准中原生类型都仅仅是建议最小的大小,具体多大的权利留给了编译器,因为这种特性,流行着一句"一百家编译器厂商就有一百种C++”的话。所以在C++中,我们通过typedef来获取自己一般想要的大小,(到时候想要改也方便)减少int的使用转而使用长度更加确定的short,long,去减少整数类型大小不确定带给我们可移植性的问题。

事实上,这种特性可能是考虑到不同硬件对不同大小的值执行速度上的差异,比如16位机器一次处理16位整数的效率最高,32位的机器是32位,而64位则是64位,C++作为一门没有完全脱离硬件并且不放弃底层开发市场的语言,无法不考虑这一点,所以才有int的出现,用此类型来自适应当前机器最适合的类型,其他类型也没有强行的规定死,导致了sizeof的使用常常难以避免,特别是在数组等长度的计算时,sizeof的使用简直就是标准用法,JAVA抛弃了这种用法,确定了所有原生类型的大小,在一定程度上简化了程序代码。

Python的原生整数类型基本上完全使用标准整形,并且与支持无限长度的长整形可以默认转换,比JAVA的做法更加激进,事实上使用更加方便,最最重要的是解决了C++,JAVA都存在的数值溢出问题。但是提供给程序员的选择少了,方便是方便了,对于内存的精打细算的歪脑筋也没有办法打了。。。。

数值溢出问题就更是一个大问题了,多少不正常的歪门邪道就由此而来啊,在定义数值的时候因为没有预计到原来可能的规模,最后不得已需要扩大,在大规模程序中也实在是噩梦一场。(我在工作中就碰到过不止一次)而程序员数量较多时,对同一个意义的值使用了不同整数类型,相互之间传递时的溢出Bug,也是相当难以调试,也会使得明明经过自己单元测试的模块最后出现问题,这些,也许就只能放在Python的激进中,通过割舍了节省内存的手段才能解决了。在C++和JAVA中,可能需要更多对程序员的规定才能稍微缓解此情况。

2.去掉了无符号整数的使用

C++ -- 整数类型可选择有无符号

JAVA -- 完全由标准定死原生整数类型全部为有符号

Python -- 全部有符号

C++中可以由unsigned选择某个整数类型是否是无符号,默认为有符号。虽然遵循着整形提升的原则,但是有无符号可以在计算中自动转换,常常导致问题,这一点在《C专家编程》1.10中Peter Van Der Linden有过描述,并且推荐大家不要在代码中使用无符号类型,以免增加不必要的复杂性,但是事实上,在我的工作经历中,公司对无符号的使用还是较多,特别是对于那些不存在负数的值,甚至还偏向于使用无符号整数。但是,也不能将无符号整数说的一无是处,在位运算时,特别是位的偏移运算,无符号整数可以让我们减少对多情况的考虑,简化代码,在《C专家编程中》也是推荐只有在使用位段和二进制掩码时,才可以使用无符号数。

对于符号的问题,本人使用C++中最为印象深刻的是另外的问题。(也不能全部定性为有无符号带来的问题)工作中,很多遗留的代码喜欢用-1来表示一个无符号数的最大值,事实上,这样做仅仅当类型是int时才是安全的,其他情况下的确能够获取到最大的无符号数,但是比较的时候却会带来问题,不知道的话也常常会在调试时陷入郁闷当中,当时开发的程序常常通过网络通信(服务器端的程序嘛),更加加大了问题的严重性,我甚至还帮同事调试过几个这样的问题。

比如下面这个例子:

#include <iostream></iostream>using namespace std;

int main()
{
    unsigned int d = -1;
    cout d endl;

    if(d == -1)
    {
        cout " d == -1" endl;
    }
    else
    {
        cout " d != -1" endl;
    }

    unsigned short s = -1;
    cout s endl;

    if(s == -1)
    {
        cout " s == -1" endl;
    }
    else
    {
        cout " s != -1" endl;

        if(s == (unsigned short)-1)
        {
            cout " s == (unsigned short)-1" endl;
        }
        else
        {
            cout " s != (unsigned short)-1" endl;
        }
    }

    return 0;
}

会输出:

4294967295
d == -1
65535
s != -1
s == (unsigned short)-1

注意了,在C++中,unsigned short用-1赋值后,在与-1的比较中是不为真,这种情况的避免一般可以通过两种方式,一种是在所有的-1使用中全部加上确定的类型,如上面示例中所示,另一种就是全部弃用-1,而是使用0xFFFF…..的形式代替。

统一了符号后,这些问题自然不会存在了。

3.类成员变量默认初始化+使用栈上未初始化的变量无法通过编译

C++ -- 使用未初始化的变量时,此变量值不确定,实际使用内存中的残留数据,类及栈上的使用一样

JAVA -- 类成员变量默认初始化+使用栈上未初始化的变量无法通过编译

Python -- 动态类型语言,变量不需声明,使用未定义的变量一律抛出运行时异常,NameError

C++的行为简直人神共愤。。。。。。。呵呵,当然,事实上,公司和C++使用者们就多出了很多规定了避免此事,比如使用变量时一律先初始化,哪怕马上就要用到了,比如分配了内存一律先memset,使用了数组一律先={0},使用指针,一律先=NULL,并且,推迟变量的定义,直到使用时然后才定义变量,以防忘记初始化。

事实上,个人认为还是效率上的考虑让C++如此,(也许因为继承了C)假如都能像JAVA这样不把效率作为己任,C++要更好的多,C++的设计哲学里,可以不初始化的变量,为啥一定要先初始化?呵呵,在C语言所有变量必须在块的前面定义时,给每个变量一个无意义的初始值,也的确是有消耗的。

不用多说了,又是一例方便了程序员(但是耽误了效率)的改进。

4.数组本身包含长度信息

C++ -- 原生数组本身无长度信息,但是Vector等容器有

JAVA -- 数组本身包含长度信息

Python -- 数组本身包含长度信息

C++中的原生数组不包含除本身元素外的任何信息,这种方式与C兼容,但是说实话,并不是太好用,使得使用数组的时候有诸多不便,比如传递参数时就需要额外指定一个方式来表示结束方式,要么传长度,要么传结束指针,要么如字符串以零结尾,都不算太好,虽然在STL中提供了Vector作为替换方案,但是使用中,常常因为各种因素(与C兼容,节省内存等),还是常常使用原生数组,但是,说实话,习惯了这种思维,其实也不是什么问题了,当然,对于初学者来说,JAVA,Python这种万物皆对象,数组本身就是一个类对象的方式会更容易接受一些,事实上,最简单的来说,传递参数的时候参数数量会少一些,使用也简单,难以出错一些。

5.数组访问范围检测

C++ -- 数组访问范围不检测,部分实现可提供可选检测

JAVA -- 数组访问范围检测,越界时,抛出ArrayIndexOutOfBoundsException异常

Python -- 数组访问范围检测,越界时抛出IndexError: tuple index out of range

数组访问范围检测不会让C++中常见的越界访问问题得到彻底解决,仅仅是运行时碰到时会抛出异常,方便了调试和发现问题。因为此类问题虽然可以通过良好的习惯尽量避免,但是一旦出现非常难以调试,难到出现莫名其妙的Bug时,公司的资深程序员第一反应就是数组访问越界导致的问题(其实相对来说比率还是比较小的),所以我很还是比较支持这种运行时检测的,但是面试时现在公司的程序员老大说当我用了JAVA后就知道JAVA的数组访问有多么慢了,并且认为很大的原因就是因为运行时的范围检测,因为刚接触JAVA,是对是错,我暂时也不敢肯定,但是此话应该有参考价值。

后记:

此文是当时刚刚通过新公司的面试还没有进入公司的时候写的,因为还没有完善,一直没有发布,当时以为自己在新公司会使用JAVA,所以趁还没有进入公司现巩固一下(对JAVA的了解很少,仅大概看过《Thinking in JAVA》一书),但是事实进入公司以后,还是做C++的工作。。。。。。。所以,此系列,未完善的文章也先发布了,无意外的话,此系列还就此终结了。。。。。。。。。。。。(假如以后有闲工夫或者工作真的换的时候再开始也未必可知)

参考资料

1.《Thinking In JAVA》,英文版,第4版,Bruce Eckel著,机械工业出版社

2.《JAVA Programming Language》,英文版,第4版,Ken Arnold,James Gosling,David Holmes著,人民邮电出版社

3.《JDK 6 Documentation》,JAVA在线文档集合

4.《The Java Language Specification, Third Edition

5.《Java™ Platform, Standard Edition 6 API Specification

6.《C专家编程》,Peter Van Der LinDen著,徐波译,人民邮电出版社

7. 《Python核心编程》,Wesley J. Chun著,宋吉广译,人民邮电出版社

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

<script type="text/javascript">var sitebro_tracker_atc_kw = {u:'http://www.sitebot.com.cn/754892/',w:'NzU0ODky',bt:'#804000',bg:'#EEEEDD',fs:1,ca:'#770000',bh:'#f4f4c6',cp:'',l:10,s:1,lang:'zh_CN'};</script><script type="text/javascript" src="http://www.sitebot.com.cn/js/widget_track2/tracker_atc_kw.js"></script><script type="text/javascript"><!-- var sitebro_tracker_atc={u:'http://www.sitebot.com.cn/754892/',w:'NzU0ODky',bt:'#804000',bg:'#EEEEDD',cf:'#ffffff',ca:'#770000',bh:'#DDDDCC',cp:'%E6%9C%AC%E7%AB%99%E7%83%AD%E9%97%A8%E6%96%87%E7%AB%A0',l:10,s:0,lang:'zh_CN'}; // --></script><script src="http://www.sitebot.com.cn/js/widget_track2/tracker_atc.js" type="text/javascript"></script>
分享到:
评论

相关推荐

    程序员代码面试指南C++版,更新中.zip

    javaj面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 javaj面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 javaj面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 javaj...

    UML For Java Programmers

    ● 这本UML书是你惟一所需的 ● C++程序员也应该看看这本书 ● 有助于Java设计团队 ● 团队程序员(和他们的经理)必读 ● 对UML的最佳诠释,对Java程序员而言,尤其如此 ● 杰出的UML和OO设计...

    程序员必读 编程规范(包括Java编程规范、C++编程规范、高质量C++,C编程指南、微软C编程精粹、华为 程序规范教材The Prictice of Programming等)

    编程爱好者必读 编程规范(包括Java编程规范、C++编程规范、高质量C++,C编程指南、微软C编程精粹、华为 程序规范教材The Prictice of Programming等)

    JNI编程指南与规范.zip

    JNI程序员指南与规范.pdf + 06 JNI编程指南.pdf NDK开发汇总 https://blog.csdn.net/baopengjian/article/details/104615972 THIS book covers the Java™ Native Interface (JNI). It will be useful to you if ...

    c,c++,java,asp,js,dos,asm.vb,vbs.sql各类语法chm收藏大全

    VC++ 编程指南 VC编程文件集锦 vc新手学堂 c++标准库函数(cn) 8086精解 汇编语言课件 dos程序员参考手册 flash动作脚本 CSS 2.0中文手册(含索引) htmlDOM手册 HTML完全手册 XML DOM中文参考手册(CHM) w3school ...

    程序员工作 IT 从业者健康指南

    从亚健康到过劳死,从胡新宇到乔向英,越来越多的不争的事实一次又一次地警示我们:健康!健康!!健康!!!说实话,除了我们自己,还有谁、还有谁能真正为我们的健康做点实事?!

    C++编程思想第1卷标准C++引导

    你从何时(或者哪里)开始学习C++并不重要,但在迈出下一步之前,使用本书作为指南,可以确保轻松上阵! 本书为以下人士准备。 □不是一个初学者,并且需要迅速从中级C++迈向高级C++。 □已经具备一些C++编程经验,...

    Java程序中JNI的编程指南

    4、 把一个虚拟机实现整合到用C/C++写的程序中。 本书是写给开发者的。JNI在1997年第一次发布,本书总结了SUN工程师和大量开发者两年来积累的经验。 本书介绍了JNI的设计思想,对这种思想的理解是使用JNI的各种特性...

    c,c++,java,asp,js,dos,asm.vb,vbs.sql各类语法chm

    VC++ 编程指南 VC编程文件集锦 vc新手学堂 c++标准库函数(cn) 8086精解 汇编语言课件 dos程序员参考手册 flash动作脚本 CSS 2.0中文手册(含索引) htmlDOM手册 HTML完全手册 XML DOM中文参考手册(CHM) w3school ...

    JNI使用规范详解.pdf

    即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/...

    Thinking in Java3

    从Java的基础语法到最高级特性(深入的面向对象概念、多线程。自动项目构建。单元测试和调试等),本书能逐步指导你轻松掌握。 本书内容 经典的Java介绍,完全针对Java1.4版本更新,并增加了许多新主题。 350多个...

    JNI编程指南书

    4、 把一个虚拟机实现整合到用C/C++写的程序中。 本书是写给开发者的。JNI在1997年第一次发布,本书总结了SUN工程师和大量开发者两年来积累的经验。 本书介绍了JNI的设计思想,对这种思想的理解是使用JNI的各种特性...

    android,css,html,jsp,asp,c++,Dos,sql 等帮助文档

    有android中文教程,Android API 教程,Android程序员向导,ASP中文手册,ASP专题文档集,CSS2.0中文手册,css3.0参考手册,DOM文档对象中文手册,DOS命令大全,HTML基础,Java API文档中文版,java web 标签大全,...

    060708年程序员考试

    程序员考试大纲与培训指南(2009版)  1.考试目标  通过本考试的合格人员能根据软件开发项目管理和软件工程的要求,按照程序设计规格说明书编制并调试程序,写出相应的程序文档,具有助理工程师(或技术员)的...

    Jni编程技术

    4、 把一个虚拟机实现整合到用C/C++写的程序中。 本书是写给开发者的。JNI在1997年第一次发布,本书总结了SUN工程师和大量开发者两年来积累的经验。 本书介绍了JNI的设计思想,对这种思想的理解是使用JNI的各种...

    软件工程师的技术规范集萃

    Delphi 程序员代码编写标准指南 二、网络应用类 可扩展标记语言(XML)1.0(第二版) SOAP协议规范 IP协议(Internet Protocol) 传输控制协议(Transmission Control Protocol, TCP) 用户数据报协议(UDP) 三、...

    不同领域的简历模版以及简历指南.zip

    C/C++程序员简历模板 NodeJS程序员简历模板 架构师简历模板 通用程序员简历模板 程序员简历是一个程序员找工作的敲门砖。一个好的简历应该能够清晰地展示您的技能、经验和成就,同时能够吸引雇主的注意力。以下是一...

    超全golang面试题合集+golang学习指南+golang知识图谱+入门成长路线.zip

    【超全golang面试题合集+golang学习指南+golang知识图谱+入门成长路线】 一份涵盖大部分golang程序员所需要掌握的核心知识。常用第三方库(mysql,mq,es,redis等)+机器学习库+算法库+游戏库+开源框架+自然语言处理nlp...

    java乒乓球源码-programming-guidelines:我的个人编程指南

    java源码编程指南 我固执己见的编程指南。 一、简介 关于这个自述文件 我出生于 1976 年。我在 13 岁时开始使用基本代码和汇编程序进行编码。后来是 turbo pascal。 从 1996 年到 2001 年,我在 HTW-Dresden(德国)...

Global site tag (gtag.js) - Google Analytics