表达式中的陷阱(分析)

运算符:java中预定义的进行某种特殊运算符号
// + — && <<
表达式
1.表达式是一种运算符和操作数合成在一 起组成的式子
运算符需要的操作数数量不相同,a+b a*b a++ ?:
运算符需要的操作数类型别不相同 a+b A+1 1+1
2.表达式都有一个结果

习题:

(一)、

int a = 10;

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

分析:

  10+(a=5)+a+(a=10)     a=10
  10+5+a+(a=10)      a=5
  10+5+5+(a=10)     a=10
  10+5+5+10
最后:30

(二)、

int i = 1;

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

system.out.println(i);

分析 :
  i = (i=i+(i+(i=2)+i)+i)+3+i
  i=i+(i+(i=2)+i)+i
  i+(i+(i=2)+i)+i
  1+(i+(i=2)+i)+i i=1
  i+(i=2)+i
  1+(i=2)+i i=2
  1+2+2
  1 + 5 +2 i=8
最后:i=19

算数运算:
算数去处的运行原理
  int a = 1, b=2,c=3
  //a+b+c
  //a+b+c*d
  //a+b*c
  System.out.println(a+b+c*d); 先运算 a+b 然后再运算c*d,再两数相加

题:

  int a = 1 ;
  int b= 2;
  System.out.println((a=3)+(b=4)+a*b);
最后:19
  分析 : 先运行3+4 然后a,b,的值改变了,赋值
  3+4 + 3*4
最后:19

自增自减运算 ++ --
int i=1
System.out.println(i+++i+++i+++i++)

  分析 :i++ + i++ + i++ + i++ i=1
  1 + i++ + i++ + i++ i=2
  1 + 2 + i++ + i++ i=3
  1 + 2 + 3 + i++ i=4
  1 + 2 + 3 + 4 i=4

最后:10
  int i=1
System.out.println(i+++++i+i+++++i)
  i++ + ++i + i++ + ++i i=1
  1 + 3 + 3 + 5 12

///自动装箱封装类对象判定
integer a = 1 //integer a = 127 //integer a = 128
integer b = 1 //integer a = 127 //integer a = 128
//java自动装箱功能
//1.首先判断当前值的范围是不是在byte的表示范围内 -128 ~ +127
2.如果在此范围内,jvm会在内在中创建一个数组,该数组中有256个数
据是从,-128+127
//自动装箱的对象,保存在一个静态数组中
Integer[] nums = new Integer[256];
Integer a = 1;
Integer b = 1;
Integer c = 1;
//3.如果不在此范围内,每次均new Integer();
注意:计算机的基本操作单位是byte,不是int ,因为使用量太大,所有做成了
一个静态(内存消化?)

综合题:
byte b =1;
byte c= 1;
b= b+1; //int赋值到byte报错
c++;
system.out.println(b==c);

byte b=1;
byte c=1;
// b=b+1; //不通过
c++;
System.out.println(b==c);
byte b=1;
//1.jvm在进行定义的变量初始化时,首先检测右侧的数据自身的数据类型与
/*左侧的常量的数据类型之间是否存在有可转化的可能性
2.检测具有可转换性,检测左边的数据类型的范围-128+127
3.检测左侧数据的值是否在范围内
4.如果在范围内,自动将左侧的数据转型成左侧的类型
5.如果不在范围内,报错。
*
* */

三目运算:

int a = 10;
double d = 9.5;
启动开发者:int a>d ? a:d
jvm: double a>d ? a:d
system.out.println(a>d ? a:d)
三目运算是一个表达式,作为一个表达式,应该有一个结果
这个结果应该有一种唯一确定的数据类型

原文地址:https://www.cnblogs.com/1906396809liufg/p/10985086.html

时间: 2024-11-04 13:11:23

表达式中的陷阱(分析)的相关文章

No.5 表达式中的陷阱

1. 关于字符串的陷阱 JVM对字符串的处理 String java = new String("Java"); 创建了几个对象? 2个."Java"直接量对应的字符串对象:new String()构造器返回的字符串对象 java.intern() 可以字符串池中的直接量对象. 字符串及基本类型的包装类,Java允许通过直接量的方式来创建对应的Java对象:除此之外,简单的算术表达式.连接计算(编译时可以确定具体值)也可以直接创建对应的Java对象 字符串直接量,J

5,表达式中的陷阱

关于字符串的陷阱: 第一次使用某一个字符串直接量得时候,jvm会将它放入字符串池中进行缓存: 关于内存泄漏例子: String str="hello" String str=str+"java" 由于String里包含得字符序列是不能被改变的. 所以第二个str是指向另外一个字符串对象,此时hello字符串就会一次在内存中,垃圾回收机制不会回收它,此时就会内存泄漏. 如果要使用String可变字符串一般使用StringBuffer和StringBuilder,但是S

编写高质量代码改善C#程序的157个建议——建议38:小心闭包中的陷阱

建议38:小心闭包中的陷阱 先看一下下面的代码,设想一下输出的是什么? static void Main(string[] args) { List<Action> lists = new List<Action>(); for (int i = 0; i < 5; i++) { Action t = () => { Console.WriteLine(i.ToString()); }; lists.Add(t); } foreach (Action t in list

[LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析

本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 举个栗子,给定 n = 3, 共有 5 个. 1 3 3 2 1 \ / / / \ 3 2 1 1

【JavaScript】JavaScript中的陷阱大集合

本文主要介绍怪异的Javascript,毋庸置疑,它绝对有怪异的一面.当软件开发者开始使用世界上使用最广泛的语言编写代码时,他们会在这个过 程中发现很多有趣的“特性”.即便是老练的Javascript开发者也可以在本文找到一些有趣的新陷阱,请留意这些陷阱,当然也可以尽情享受由这些陷阱 带来的“乐趣”! AD: 本文主要介绍怪异的Javascript,毋庸置疑,它绝对有怪异的一面.当软件开发者开始使用世界上使用最广泛的语言编写代码时,他们会在这个过 程中发现很多有趣的“特性”.即便是老练的Java

Android 中图片压缩分析(上)

作者: shawnzhao,QQ音乐技术团队一员 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩. 前者是在不改变图片尺寸的情况下,改变图片的存储体积,而后者则是降低图像尺寸,达到相同目的. 由于本文的篇幅问题,分为上下两篇发布. 二.Android 质量压缩逻辑 在Android中,对图片进行质量压缩,通常我们的实现方式如下所示: ByteArrayOutputStream outputStream = new Byte

FreeBSD 内核中的SYSINIT分析【转】

FreeBSD?kernel是一个膨大的系统,?对于这样一个大系统,?里面往往包含了大量的子系统和??模块,当系统初始化时这些模块就需要初始化,?按照通常的思路,这些初始化过程必须在某处??被显式地调用,这样一来,当你新增某个模块,你必须再修改那个系统初始化的地方来调用这??个新增模块的初始化过程,?而且由于ANSI?C语言的限制,调用某个函数最好先声明,这样当系??统的初始化过程开始增加时,?那个调用初始化过程的文件开始大量包含那些本来不相关的头??文件,?偶合度就增加了,?这是一种不好的设计

boost在lambda表达式中调用占位符参数的成员函数的方法

boost中提供了lambda表达式的用法,但是lambda表达式的功能还不是很强大,在其中只能对lambda的占位符参数_1等使用最基本的操作符,如+-*/,可是很多时候如果传入的占位符参数是一个对象指针的话,我们可能想要调用这个类的成员函数. 我在开发中遇到了这个问题,需要在stl的算法中传入一个函数来调用对象的比较函数,因为感觉这样太麻烦,还需要重新定义一个函数,所以想起了lambda表达式,c++11的lambda表达式我倒是没试过,可是受项目开发环境所限,只能选择boost.但是我用的

C中的Float分析

C/C++中, 浮点数,float以及 double 在内存中是怎样存储的? 假如,我有32-bit 8bit 8bit 8bit 0 0 0 0 0 1 1 1 1 对于整形int,我们可以很快得出,这是 int i = 15的内存形式. 假设,最低位的bit的位权为-1,最高位为30. 那么这个就不再表示数字15了,而是 2^-1+2^0+2^1+2^2 = 7.5 了. 当然,上面只是假设,那么真正的Float 浮点型 在内存中是什么样子的呢? 首先需要知道的是 float 在内存中 占