Java--关于计算表达式中赋值的细节问题

public class Test {
    public static void main(String[] args) {

        int t = 0;
        int p = 0;
        int q = 0;
        int tail = 1;
        int head = 2;

        /**
         * 这个(t != (t = tail))表达式进行判断的时候
         * 第一个t还是未复制之前的值,第二个t是赋值之后的值
         * 所以这里不是想象中的false,而是会出现true的
         * 注意这个细节点
         */
        p = (t != (t = tail)) ? t : head;
        System.out.println(p);
    }
}
时间: 2024-08-06 05:57:11

Java--关于计算表达式中赋值的细节问题的相关文章

Java随笔:表达式中隐藏的溢出

下面这段代码的输出是什么? long lvar1 = 24 * 60 * 60 * 1000 * 1000; long lvar2 = 24 * 60 * 60 * 1000; System.out.println(lvar1 / lvar2); 一眼看去,应该是1000. 实际的输出是什么呢?5 为什么会得出这样奇怪的结果.我们来反汇编看一下: 执行:javap -c LongOverflowTest.class 结果可以看到: public static void main(java.lan

java、el表达式中保留小数的方法

Java中: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class format { double f = 111231.5585; public void m1() { BigDecimal bg = new BigDecimal(f); double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP

Java语言与JVM中的Lambda表达式

Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法. Lambda表达式,这个名字由该项目的专家组选定,描述了一种新的函数式编程结构,这个即将出现在Java SE 8中的新特性正被大家急切地等待着.有时你也会听到人们使用诸如闭包,函数直接量,匿名函数,及SAM(Single Abstract Method)这样的术语.其中一些术语彼此之间会有一些细微的

java中变量运算细节 (2)

/* 目的:测试变量的运算方式 结果:byte a, b, c; a = b+c; 或者 a = b+10 形如这种形式的算式, 等式的右边的运算结果默认的都是int型的!因为等式右边有变量, 编译器无法确定变量的内容 ,因为它是变量!所以相加之后得到的int再默认强制转换成byte可能会损失精度. 而形如 a=4+5:这种常量的赋值,虽然 4 和 5 都默认的是int, 但都是常量,它们的值是确定的!所以如果 4+5的值超过了 byte的最大值的范围, 那就会编译出错!(也就是等式右边都是常量

探索Java语言与JVM中的Lambda表达式

Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法.(2013.01.02最后更新) Lambda表达式,这个名字由该项目的专家组选定,描述了一种新的函数式编程结构,这个即将出现在Java SE 8中的新特性正被大家急切地等待着.有时你也会听到人们使用诸如闭包,函数直接量,匿名函数,及SAM(Single Abstract Method)这样的术语.其

Java中String类型细节

Java中String类型细节 一 . String两种初始化方式 1 . String str1= "abc";//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测"abc"是否存在 若存在则不重复创建,将地址赋值给str1. 若不存在,则在字符串缓冲区中创建对象并赋地址给str1. 2 . String str1= new String( "abc"); //构造函数初始化  或者  char [] ch={'a','b'

基于Java语言的表达式计算

一个表达式包含+.—.*./.()运算符,要计算表达式的值.此处运用栈,分别存储操作数和操作符,大体思路是利用双栈把中缀表达式转换成后缀表达式进行计算. 1.拆分数字与运算符遇到运算符截断.存储.清空.2.转后缀表达式栈A存放后缀表达式,栈B存放运算符记 B栈顶运算符为a1,当前运算符为a2(若a2为数字直接 a2->A )1)若 a1>a2,a1->A,a2->B1)若 a1<a2,a2->B:2)若 a1>=a21.若a1>a2,a1->A:(只要

Java中的小细节

1.访问权限 1.private 只有本类才能被访问 2.default(默认)只有本包中才能被访问 3.protected只有子类和本包才能被访问,可以跨包. 4.public 可以在所有类中被访问 2.Java命名规范 1.类.所有单词首字母大写 2.方法.第一个单词的首字母小写 3.属性.第一个单词的首字母小写 4.包名.所有单词小写 5.常量.所有单词的字母大写.final定义的 Java中的小细节,码迷,mamicode.com

Java动态执行计算表达式利器 -- ScriptEngine

在通过配置文件对系统进行参数配置时,有时需要更好的理解参数值的具体意义,往往采用计算表达式的方式设置,例如1天换成秒数为86400,如果写成24 * 60 * 60就很清晰的表达是一天的秒数.但是这个表达式通过properties的方式获取为字符串,这里就需要动态计算这个表达式. ScriptEngine这个对象专门用来处理动态执行表达式,主要调用其eval方法动态执行(类似于javascript中的eval方法),其返回结果为object对象:针对计算表达式的返回结果是double类型,所以这