ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

5分钟带你从数据类型了解Java相比C/C++有什么优势

2022-11-10 14:12:18  阅读:322  来源: 互联网

标签:java 函数 学习 系统 语言 平台 方法 安装 QML c++ 数据


数据类型是一门语言的血肉,通过这5分钟的浏览,只学过C/C++的小伙伴会初步了解Java的一些特性,学过一点Java的朋友在读完这篇文章后也一定会对Java的语法规范有更深刻的了解

Java数据类型分为两大类,一类为基本数据类型,包含了int、char等八种数据类型,另一类为引用数据类型(该类型我们暂且不讨论)

首先先让我们看看Java的八种数据类型有哪些:

可移植性

想必大家都知道C/C++的数据类型大小在不同机器、不同编译器上都会有些许的差异,例如在32位电脑上和64位电脑上long的大小就不同,这就导致同样的代码在64位上可以正常运行,但放到32位计算机上就可能会出现溢出等情况。

但Java完全不会有这种顾虑,无论是32位还是64位,所有数据类型大小都是相同的,这就大大减轻了程序员移植代码的难度。

健壮性

在学过C和C++之后再来学Java,我很明显感觉到Java是一门很“矫情”的语言

如果在程序员面前C/C++是

那在程序员面前Java就是。。

想必C/C++的小伙伴都见过这样的代码

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int i = -10;
	unsigned int ui = 10;
	
	if (ui > i) 
        cout << "yes" << endl;//printf("yes
");
	else 
        cout << "no" << endl;//printf("no
");
}

结果为no,道理应该大家都知道,这是因为在(ui>i)时,i被隐式转化为了unsigned类型,由补码反码的知识我们知道-10用unsigned表示是4294967286,道理很简单。但是在项目中你很可能因为一个走神写下了这样的错误,导致程序能正常编译,运行结果却和预料的结果大相径庭(大家应该都有花半个小时甚至一个上午找这种“小”BUG的经历吧。。)

但在Java中,无符号类型直接被砍掉了,没错这样直接根除无符号类型的BUG。。

其实我觉得在这里我很支持Java,因为unsigned存在的价值本身就不大,与signed只是一个二倍的关系。范围没大多少,但使用错误的后果却是极大的,除了上面的代码之外还有下面这种常见无符号BUG:

unsigned int ui=1;
cout<<ui-2<<endl;

最后的输出就是一个很大的数。

除此以外,Java对变量的常数赋值也做了很多限制,例如:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	char c = 888888;
	cout << c << endl;
}

在C/C++这串代码就能正常运行,C/C++编译器默认你知道数字会溢出,知道数据会被截断,因此并没有报错,最多是给你一些警告。

但在Java中这样写。。

是的,直接无法编译,因为byte最大值为127,130已经超过了byte的范围。

除此以外Java中还不允许出现把表示大范围的数赋值给小范围数的情况,如下:

等一下!有什么奇怪画面出现了!

与C/C++顺从不同,直接硬上Java是不愿意的,那么如何让Java乖乖听话呢,那当然是用一些工具胁迫他啦,嘿嘿嘿。。。

没错,就是显示类型转化!(要不然还能是什么?)

public class Test {
    public static void main(String[] args) {
        int a=1;
        byte b=(byte)a;
        System.out.println(b);
    }
}

切记!

一个数据能否赋值取决于该类型的表示范围,而不是内存大小,把short类型的数据给char(在Java中char为两个字节)也是不行的!!!因为short可以表示负数,而char不可以!

到了这里你应该已经理解了Java的健壮性是如何而来的了。

那么这里我再给大家看看一些有趣的代码(Java程序员看过来!)

public class Test {
    public static void main(String[] args) {
        byte a=1;
        byte b=2;
        byte c=a+b;
        System.out.println(c);
    }
}

答案理所应当输出3对吧!

但很可惜并不是,因为这段代码根本不能成功编译。。。

原因就在于在进行该运算时,byte发生了整型提升(不知道整型提升的可以在搜一下相关博客)

因此在这里c接收到的其实是一个int大小的数据,大范围不能给小范围变量赋值,所以报错了。

高效率

在Java中,每一个基本数据类型都有一个包装类,如下图

在包装类中封装了对该类型的一些常用操作,以int为例

public class Test {
    public static void main(String[] args) {
        int a=1;
        int b=2;
        System.out.println(Integer.MAX_VALUE);//获取整型最大值2147483647
        System.out.println(Integer.max(a,b));//a和b的max 2
        System.out.println(Integer.reverse(a));//翻转数字,输出-2147483648

标签:java,函数,学习,系统,语言,平台,方法,安装,QML,c++,数据
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有