java表达式1 29的计算结果是,java表达式陷阱 - Funcy1122的个人空间 - OSCHINA - 中文开源技术交流社区...

1.赋值运算

1.1 表达式直接赋值

int a = 1;

a = 2;

System.out.println(a);

1.2 同一表达式多个赋值

int a = 10;

int b = a+(a=5)+a+(a=10);

System.out.println(b);

System.out.println(a);

运算过程如下:

int b = a+(a=5)+a+(a=10);

(1)10+(a=5)+a+(a=10)a = 5

(2)10+5+a+(a=10)a = 5

(3)10+5+5+(a=10)a = 10

(4)10+5+5+10

最终结果:a=10,b=30

1.3 多个括号的赋值

int i = 1;

i = (i=i+(i+(i=2)+i)+i)+3;

System.out.println(i);

计算过程如下:

i = (i=i+(i+(i=2)+i)+i)+3i=1

(1) i = (i=1+(1+(i=2)+i)+i)+3i=2

(2) i = (i=1+(1+ 2 + 2)+2)+3i=2

(3) i = (i= 8 )+3i=8

(3) i = 11 i=11

最终结果:11

2.自增操作

2.1 自增(++)与加(+)组合

int i = 1;

System.out.println(i+++i+++i+++i++);

思考过程如下:

(1) 拆解:可以从最右边进行拆解,一步步来进行:

(2)i++ + i++ + i++ + i++i = 1

(3)1 + i++ + i++ + i++i = 2

(4)1 + 2 + i++ + i++i = 3

(5) 3 + i++ + i++i = 3

(6) 3 + 3 + i++i = 4

(7) 6 + i++i = 4

(8) 6 + 4i = 5

最终结果:10

3.关系运算:==

3.1 不同基本数据类型间的比较

int a = 10;

int b = 10;

doublc c = 10.0;

//两个值相等,结果为true

System.out.println(a==b);

//先将a的值由int->double,然后再比较a与c的值

System.out.println(a==c);

3.2 数学运算导致小数精度不准

System.out.println(3.14 * 10 == 31.4);

结果:false

计算机中各小数逼近值如下:

0.5 = 1/2

0.25 = 1/4

0.125 = 1/8

0.0625 = 1/16

0.03125 = 1/32

0.015625 = 1/64

0.0078125 = 1/128

计算机表示小数时,有些小数并不能精确表示,只能通过无限逼近的形式表示:

3.14=3+0.125+0.0078125+...

3.14是一个不能精确表示的数,因此会有精度问题,jvm计算的值为:

3.14 × 10 = 31.400000000000002

3.3 Integer自动装箱/拆箱问题

Integer a = 1;

Integer b = 1;

System.out.println(a == b);

结果:true

a = 127;

b = 127;

System.out.println(a == b);

结果:true

a = 128;

b = 128;

System.out.println(a == b);

结果:false

java自动装箱功能

首先判断当前值的范围是不是在byte的表示范围内 -128 ~ +127;

如果在此范围内,JVM会在内存中创建一个数组,该数组中有256个数据数据是从-128 +127,自动装箱的对象 保存在一个静态数组中;

如果不在此范围内,每次均new Integer().

4.逻辑运算符&/&& |/||

System.out.println(true | false & false);

结果: true

结论:java语言中,与&运算比或|运算级别高

5.移位运算:<>>/>>>

int a = 10;

System.out.println(a<<1);

System.out.println(a<<2);

System.out.println(a<<32);

System.out.println(a<<33);

结果:

20

40

10

20

左移操作时,byte类型会隐式转换成int:

byte b = 1;

System.out.println(b<<1);

System.out.println(b<<2);

System.out.println(b<<8);

System.out.println(b<<9);

结果:

2

4

256

512

结论:

左移(<

左移32位,会变成原来的数据大小(相当于左移0位),左移33位,相当于左移1位;这里的32,是指数据类型的位数,如果移动的是long类型数据,需要左移64位才变成原来的数。

移位运算,操作数必定是int或long类型,如果是byte或short,也会隐式转换成int.

6.三目运算符

6.1 三目运算时,如果条件表达式确认了取哪一个值,那么另一个值将不再进行运算

int a = 2;

int b = 1;

int c = a > b ? (a = 4) : (b = 3);

System.out.println(a);

System.out.println(b);

System.out.println(c);

结果:

4

1

4

6.2 三目运算是一个表达式,作为一个表达式,应该有一个结果,这个结果应该有一种唯一确定的数据类型

示例一:

int a = 10;

double d = 9.5;

System.out.println( a > d ? a : d );

结果:

10.0

说明:数据类型不同时,会先统一数据类型,再进行计算。这里会先将int转换成double,再计算表达式的值,即:

double x = a > d ? a : d

示例二:

System.out.println( 3 > 2 ? 1 : true );

结果:1

说明:

3 > 2 ? 1 : true 该表达式虽然数据类型不同,但能通过编译;

java中,基本数据类型有一个自动装箱的过程,以上表达式等价于: Object x = 3 > 2 ? new Integer(1) : new Boolean(true);

7.复合赋值表达式:+=/-=/×=...

示例一:复合表达式与处增结合

int a = 1;

a+=a++;

System.out.println(a);

结果:

2

计算过程如下:

1)a = a + a++;a=1

2)a = 1 + a++; a=2

3)a = 1 + 1

4)a = 2

示例二:多个复合表达式结合

int a = 1;

a+= a+= a++;

System.out.println(a);

结果:

3

计算过程如下:

1)a+= (a+= a++); //找到第一个+=,将后面的内容添加一个括号

2)a=a + (a+= a++); //计算第一个+=:拆成"a=a+xx"的形式

3)a=1 + (a+= a++); //此时a=1

4)a=1 + (a= a + a++); //计算括号中+=:拆成“a=a+xx"的形式

5)a=1 + (a= 1 + a++); //将a=1代入

6)a=1 + (a= 1 + 1); //将a=1代入,此时a=2

7)a=1+ (a= 2); //赋值,a=2

8)a=1+2;

9)a = 3

示例3:复合、自增、赋值结合求值

int a = 1;

a+=(a=2)+ (a+=(a=3)+a++);

System.out.println(a);

结果:

8

计算过程如下:

a+=((a=2)+ (a+=(a=3)+a++)); //找到第一个+=,将后面的表达式添加一个括号

a=a+((a=2)+ (a+=(a=3)+a++)); //将+=拆成"a=a+xx"

a=1+((a=2)+ (a+=(a=3)+a++)); //将a=1代入

a=1+(2+ (a+=(a=3)+a++)); //计算a=2,此时a=2

a=1+(2+ (a+=((a=3)+a++))); //找到第二个+=,将后面的表达式添加一个括号

a=1+(2+ (a=a+((a=3)+a++))); //将+=拆成"a=a+xxx"

a=1+(2+ (a=2+((a=3)+a++))); //代入a的值,此时a=2

a=1+(2+ (a=2+(3+a++))); //计算a=3,此时a=3

a=1+(2+ (a=2+(3+3))); //计算a++,此时a=4

a=1+(2+ (a=8));

a=1+(2+ 8);

a = 11

示例4:复制表达式与自动类型转换

在java中,类型转换时,可以如下操作:

int a = 1;

//1.低类型向高类型转换,可以自动转换

double b = a;

//2.高类型向低类型转换,需要强制类型转换

byte c = (byte)a;

但复合表达式中,自动类型转换并不是这样:

int a = 1;

a+=3.5;

System.out.println(a);

结果:

4

在这里+=符号右边的操作数被转化成左边的类型,不管右边是否高于左边,全部自动转换成左边的形式。

即上面的计算等价于:a = a + (int)3.5

示例5

int a = 1;

a+= 4294967295L;

System.out.println(a);

结果:

0

计算过程:

a=0000-0000 0000-0000 0000-0000 0000-0001

b=0000-0000 0000-0000 0000-0000 0000-0000 1111-1111 1111-1111 1111-1111 1111-1111

计算时,表达式如下:

a = a + (int)4294967295L

因此,实际上进行计算的是

a=0000-0000 0000-0000 0000-0000 0000-0001

b=1111-1111 1111-1111 1111-1111 1111-1111

由于结果超过了int的范围,超过32位的部分会截断,最终结果为0.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

netbeans7.4_NetBeans 7.2 beta:更快,更有用

netbeans7.4NetBeans 7.2的beta版本引起了极大的兴奋。 在本文中&#xff0c;我将简要介绍一下此版本令人兴奋的原因&#xff08;包括更好的性能&#xff0c;提供更多的提示以及集成FindBugs&#xff09;。 NetBeans 7.2 beta在典型的下载捆绑软件中可用&#xff0c;从较小的Ja…

C-Free 5.0编译失败问题解决办法

解决关于C-Free 5.0编译时提示错误&#xff1a;[Error] undefined reference to __dyn_tls_init_callback 解决办法&#xff1a; 因为错误提示的路径是C:\MinGW\..... 首先想到的是编译器出问题了&#xff0c;因为我在安装完C-Free 5.0后&#xff0c;重新装过MinGW编译器&#…

php强类型作用,php类、接口、抽象、trait、强类型使用

declare(strict_types 1);//declare(strict_types1);//php7严格模式,只规定当前文件使用严格模式//function test(string/int/Obj/array):void/int/?int//返回值和参数可指定类型/*function test(string $a,int $b,Obj $obj,array $arr,boolean $boo):?int{if($boo true){r…

用Cucumber JVM编写BDD测试

Cucumber JVM是编写BDD测试的出色工具。在本文中&#xff0c;我想对Cucumber JVM的BDD进行介绍。 让我们开始吧… 什么是BDD&#xff1f; 简而言之&#xff0c;BDD试图解决“通过示例理解需求”的问题 BDD工具 有许多用于BDD的工具&#xff0c;有趣的是&#xff0c;您可以在…

Bootstrap之栅格系统

bootstrap 移动优先  中文官网 http://www.bootcss.com/ 1.基本模板 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 兼容IE --><meta http-equiv"X-UA-Compatible" content"IEedg…

计算器界面网格布局java,安卓案例:网格布局实现计算器界面

安卓案例&#xff1a;网格布局实现计算器界面一、网格布局(GridLayout)GridLayout布局使用虚细线将布局划分为行、列和单元格&#xff0c;也支持一个控件在行、列上都有交错排列。(一)继承关系图(二)常用属性1、针对布局的属性(1)rowCount&#xff1a;行数(2)columnCount&#…

如何让多文本内容只显示一行,其余用省略号来显示

在此需要用到三个属性配合使用&#xff1a; overflow: hidden;/*超出部分隐藏*/white-space: nowrap;/*不换行*/text-overflow:ellipsis;/*超出部分省略号显示*/实例&#xff1a;<p> 兴高采烈的破蛹 重获新生的冲动 寻找爱情世界 美梦  既然不是毛毛虫 就要壮烈的扑火 …

php正则替换p闭合标签,php正则替换标签的实现方法

php正则替换标签的实现方法&#xff1a;首先通过“strip_tags”函数剥去字符串中的HTML标签&#xff1b;然后利用正则表达式替换标签&#xff0c;代码语句如“pregreplace("/s/","",strpregreplace("/s/","")”。推荐&#xff1a;《PH…

php关于ob_start('ob_gzhandler')启用GZIP压缩的bug

如果使用ob_start("ob_gzhandler"); 则ob_clean()后面的输出将不显示&#xff0c;这是个bug&#xff0c;可以用ob_end_clean();ob_start("ob_gzhandler"); 代替ob_clean();否则后面输出内容将是空。 <?phperror_reporting(E_ALL);ob_start("ob_gz…

php ip 省份,PHP有没有生成国内各省份IP地址的类库?

最近项目需要用到随机生成国内IP地址的功能&#xff0c;在网上找了个方法&#xff1a;function rand_ip(){$ip_long array(array(607649792, 608174079), //36.56.0.0-36.63.255.255array(975044608, 977272831), //58.30.0.0-58.63.255.255array(999751680, 999784447), //59…

Html_Img元素 设置图片与其他元素横排高度一致

<img id"numAdd" src"~/Images/jia.jpg" style"width:30px;height:30px;vertical-align:middle;" > 转载于:https://www.cnblogs.com/ingstyle/p/6208202.html

POJ1201 区间

题目大意&#xff1a; 给定n个整数区间[ai,bi]和n个整数ci,求一个最小集合Z&#xff0c;满足|Z∩[ai,bi]|>ci(Z里边在闭区间[ai,bi]的个数不小于ci)。 多组数据&#xff1a; n&#xff08;1<n<50000&#xff09;区间的个数 n行&#xff1a; ai bi ci(0<ai<bi<…

java maven 项目依赖关系,java – 关于依赖关系共享的Maven多模块项目组合

有几个类似的问题,但没有这样的.你如何处理这种情况(典型情况)&#xff1a;一个由8-11个子项目组成的项目,具有父工件/项目和一个主要项目,主要使用/声明其他项目作为模块.问题是所有项目“严格”只共享公共依赖项,如testng,logging,apache commons和stuff.但总是喜欢其中3个使…

junit:junit_JUnit和Hamcrest:在assertEquals上进行改进

junit:junit在我的博客文章中&#xff0c;Java越来越接受静态导入吗&#xff1f; 在本文中&#xff0c;我讨论了在Java中越来越多地使用静态导入来使代码在某些情况下更加流畅。 Java中的 单元测试特别受静态导入的影响&#xff0c;在此博客文章中&#xff0c;我提供了一个简单…

java 语音匹配,java-语音识别,是否可以通过正则表达式确定用户所说的内容?

通常,我建议您为返回的每个单词生成一个Soundex,将您要查找的单词的Soundexes对整个列表评分,作为匹配的一部分字符,并使用这些评分来确定哪个单词更可能成为比赛.例如,开始编码为S363,停止编码为S310.下表根据单词的百分比对匹配的单词进行评分&#xff1a;Word Soundex S363 …

vue.js 2.x 能否设置某个组件不被keep-alive 的解决方案

开发项目的时候&#xff0c;使用的是 vue 2.x 版本 搭配路由切换 vue-router &#xff0c;但是很多时候有些页面需要被缓存&#xff0c;有些页面不需要缓存&#xff0c;那么该如何进行一个处理 这里我使用了一个方案来解决这个问题 : 首先在入口页面进行全部缓存标签 即 <ke…

JWT –生成和验证令牌–示例

JWT提供了一种非常有趣的方式来表示可以验证和信任的应用程序之间的声明。 我的目标是展示一个小的样本&#xff0c;它使用出色的Nimbus JOSE JWT库来生成和验证令牌。 总览 进行介绍的最佳地点之一是这里 。 简而言之&#xff0c;要从jwt.io网站的资料中借用&#xff0c;声明…

无表头单链表的总结----输出链表

#include"head.h" void print(struct Student* head) {struct Student *p;printf("There are %d records:\n", sum);p head;if (p ! NULL){do{printf("%ld %d\n", p->num, p->score);p p->next;} while (p ! NULL); //以链表结尾的…

matlab 次坐标轴 标注,matlab标注坐标轴

matlab绘图如何添加图例/坐标轴刻度像这个图里的 那样的图例如何添加 还有坐标轴的刻度如何用像上图的序号 首先打开电脑上的“matlab”软件&#xff0c;主界面如下图所示&#xff0c;箭头处输入代码即可运行。下面输入代码绘制图像&#xff0c;命令行代码如下图所示。点击ente…

JQUERY操作html--获取和设置内容、属性、回调函数

一&#xff1a;jQuery - 获取内容和属性 1.获得内容 - text()、html() 以及 val() text() - 返回所选元素的文本内容 html() - 返回所选元素的内容&#xff08;包括 HTML 标记&#xff09; <script type"text/javascript" src"jquery-1.11.2.min.js">…