java面试题之++i与i++与运算符优先的问题

【C++语言】彻底搞懂++i和i++ 目录 1 概念 2 前缀递增示例 2.1 示例代码 2.2 解题思路 3 后缀递增示例 3.1 示例代码 3.2 解题思路 4 混合表达式示例 4.1 示例代码 4.2 解题思路 1 概念 ++是单目运算符:++i是前缀递增,先参与表达式运算,然后再自增;i++是后缀递增,表示先进行递增,然后再参与表达式运算。 2 前缀递增示例 2.1 示例代码 #include<iostream> using namespace std; int main(int arg. 阅读详情

写在前面的话

java程序员这一行,只有不断的学习和进步,才能在现在竞争越来越激烈的市场环境生存下来,而对于我们来说基础就更为重要了。扎扎实实地打好基础,练好基本功,我认为这是学好java的“秘诀”。最近去参加面试,遇到常见的自增变量相关的面试题还是比较多的,特地记录一下。

面试题

首先面试题目是这样的:

    public static void main(String[] args) {
        int i = 1;
        int j = i++;
        int k = i + ++i * i++;
        System.out.println("i=" + i + ",j=" + j + ",k=" + k);
    }

运行结果:
在这里插入图片描述
看似十分简单的一个题目,但是得出的结论却出乎我们的意料,为什么呢?这道题目实际上涉及到了几个知识点,下面一个个说明。

分析过程

  • int i = 1
    首先这个就是简单的一个赋值操作,即在栈中给i分配了一个值1,这也没什么好说的,挺简单的一个赋值操作。
  • int j = i++
    这个就要特地注意++运算符的问题,比如i++与++i的赋值和自增操作先后的问题。
    如果是int j=i++,则是先将i的值赋给j,所以这里j=1,然后i自增加1,所以i=2。
  • int k = i + ++i * i++
    这里这块运算需要小心一点啦,不然很容易出错,特地需要注意是++i与i++,刚刚入门小白的时候很容易把这俩运算过程给整混淆,只需牢牢记住++在前:先自增然后在做运算,++在后先做运算在自增的秘诀即可。所以这里最开始i=2,++i这里是i先自增1就变成了3,然后这个值乘以i++,而i++首先是先做运算,即前面乘以的是3,然后i自增为4。综上所述:k=2+3*3=11,i=4。

经典升级配合&&

public static void main(String[] args) {
        int x = 0;
        int y = 0;
        int k = 0;
        for (int z = 0; z < 5; z++) {
            if ((++x > 2) && (++y > 2) && (k++ > 2)) {
                x++;
                ++y;
                k++;
            }
        }
        System.out.println(x + "," + y + "," + k);
    }

这里面考察了++运算符执行的过程,以及&&操作运算法的执行过程。

分析过程

首先最总要的就是上面一个判断3个&&的问题,只有一个个条件满足了才会执行后面的计算操作,其次就是++运算符的运算问题。下面for循环一共循环了5次,让我们分析一下x,y,z的值的变化。注意++在前:先自增然后在做运算,++在后先做运算在自增这个秘诀就可以轻松面对此面试题。

  • z=0
    当循环第一次的时候,x自增后的值为1不满足大于2,所以if语句里面的代码块并没有执行,此x=1,y=0,k=0。
  • z=1
    循环第二次的时候,x自增后的值为2不满足大于2,所以同样if语句里面的代码没有执行,此时x=2,y=0,z=0。
  • z=2
    循环第三次的时候,x自增后的值为3大于2,满足第一个判断条件,所以会执行(++y > 2)这个判断,y自增后的值为1不满足大于2条件。此时x=3,y=1,k=0。
  • z=3
    循环第四次的时候,x自增的后的值为4大于2,满足第一个判断条件,执行(++y > 2)判断,y自增后的值为2,不满足大于2的条件,此时的x=4,y=2,k=0。
    -z=4
    循环最后一次的时候,此时x自增5大于2,y自增后的值3大于2,执行(k++ > 2)判断,此时k=0,不满足大于2,然后k在自增1。
    所以上面最终输出的结果是:
    在这里插入图片描述

运算符优先问题


 public static void main(String[] args) {
        int x = 10;
        int y = 10;
        System.out.println("x+y="+x+y);
        System.out.println("x*y="+x*y);
        System.out.println("x/y="+x/y);
    }

第一个打印:x+y=1010 ,第二个打印x*y=100,第三个打印x/y=1;

本人在各大公司都会遇到上面++自增变量的问题,特地分享3道经典面试题,这是javaSe一大经典的一个考点。

i++所遇到的坑

之前在刷面试题也遇到一个坑,代码如下:

    @Test
    public void testCount() {
        int count = 0;
        int y =0;
        for (int i = 1; i <= 10; i++) {
            y = count++;
        }

        System.out.println(y);
    }

聪明的你肯定知道这个输出是9,如果我们将代码这样改呢?

    @Test
    public void testCount() {
        int count = 0;
        int y =0;
        for (int i = 1; i <= 10; i++) {
            count = count++;
        }
        System.out.println(count);
    }

这次输出还是9吗?but运行后发现结果是为0。咋回事呢?其实dubug后发现每次循环count 的值都是为0,查阅相关资料总结如下:

  1. 循环的时候首先把count的值(注意是值,不是引用)拷贝到一个临时变量区。
  2. 然后对count变量加1。
  3. 返回临时变量区的值,注意这个值是0,没修改过。

所以每次循环最后返回的值都是0,最终结果当然就是0了,上面过程count = count++;可以用下面代码解释方便进行理解。

   public static void change(int count) {
       count++;
    }

所以每次修改后,相当于在新的内存区间进行操作并没有赋值给原来的变量,所以每次操作后原来的值都是为0。

Java运算符优先级 寒假作业 阅读详情

相关推荐

泛微E8流程监控指南:如何用SQL实时追踪审批节点状态?

本文详细介绍了如何利用SQL实时监控泛微E8系统中的审批流程状态,包括核心数据表结构解析、全链路监控SQL实战以及智能预警机制设计。通过数据库直接查询和状态关联分析,帮助企业快速定位卡顿节点,提升流程效率。适用于需要优化OA系统流程管理的企业IT人员和业务主管。

weixin_30687051的博客 440

++i+i++

偶然看到一个朋友的QQ验证问题:int i=0;i+=++i+i++;++i+i++=? 在不同的环境里面运行结果竟然不一样,leetcode的结果是13,VS里是10,eclipse是6,然后上网查了一下,可能跟C++和Java对于自增操作的不同处理有关,在Java中,对于i=i++,JVM会先把i的初值(即为0)拷贝到临时变量区,然后对i值+1,此时i值是1,然后返回临时变量区的值并赋值给i

cuihaolong的专栏 1165

STM32G0实战:HAL库与LL库Flash操作避坑指南(附HardFault解决方案)

本文深入剖析了STM32G0系列微控制器在Flash操作中常见的HardFault问题,对比了HAL库与LL库在读写擦除操作上的底层差异与潜在陷阱。文章提供了基于寄存器状态分析的精准调试方法,并给出了经过实战检验的解决方案与健壮的代码框架,帮助开发者有效规避数据丢失与系统崩溃风险。

t8u9v0w1x的博客 731

你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?

本文字数:2355字阅读本文大概需要:6 分钟我想大部分都知道 i++ 和 ++i的区别,i++ 就是先拿i来使用,之后再自增加1,而++i则是先自增加1,在拿i来使用,...

好好学java 2368

三甲医院网络架构与安全建设实战

华为OceanStor] [华为OceanStor][PACS存储双活] [HIS数据库同步]患者隐私 数据脱敏 天清Web防火墙动态脱敏策略。主数据中心 --[OTV专线]-- 备数据中心。实现医疗业务网/卫生专网/互联网三网隔离。核心业务配置(华为CE6865)自动备份配置(每天02:00)安全事件响应(30分钟SLA)漏洞扫描(每周日00:00)实现医疗物联网统一接入管控。五、等保2.0合规关键配置。堡垒机登录(双因素认证)四、医疗物联网安全方案。

有小小的远大抱负 1911

光猫改桥接后,一根网线搞定IPTV和上网的保姆级教程(附VLAN配置避坑点)

本文详细介绍了光猫改桥接后如何通过单线复用技术实现IPTV和上网功能共存。从VLAN配置原理到具体操作步骤,包括光猫超级管理员权限获取、VLAN绑定设置及路由器IPTV功能配置,提供了全面的保姆级教程。特别针对常见问题如IPTV信号丢失、网速下降等给出了实用解决方案,帮助用户轻松避坑。

weixin_29927965的博客 1800

我来告诉你怎么计算i++ + ++i + i++以及为什么i++和++i区别这么大?

先来看原理: 我们知道,++作为后置递增时,优先级为16,而作为前置递增时,优先级为15=作为赋值运算符时,优先级为3所以,++会优先于=而执行 结论: 当运算符在操作数之前,称为前增量运算符,它对操作数进行增量操作,并返回计算后的值{var i=1;j=++i;(实际上j=i+1)}。 当运算符在操作数之后,称为后增量运算符,它对操作数进行增量操作,但返回未做增量计算

qq_31796565的博客 4893

2026年数字IC设计禾赛科技笔试带答案解析

本文介绍了一份数字IC设计工程师笔试的试卷结构和部分题目解析。试卷包含15道单选题(30分)、10道填空题(20分)和5道简答/编程题(50分),总分100分,考试时长120分钟。单选题涉及同步时序电路、Verilog语法、跨时钟域设计、FPGA优化、存储器层次、功耗优化等知识点;填空题考查环形振荡器、工艺参数、时序约束、LUT结构等基础概念。试题重点考察应聘者对数字电路设计核心概念的理解和实际工程应用能力,特别是针对激光雷达芯片设计中的关键技术点进行考核。

Open 125

(++i)+(++i)+(++i)计算的探讨

简要介绍(++i)+(++i)+(++i)计算的探讨

weixin_72817878的博客 2287

在ubuntu20.04中安装MATLAB时常见问题及解决方法

   如果你刚装完ubuntu20.04,这时你想要安装MATLAB2021A,在输入命令./install进行安装时,可能会报以下错误:    terminate called after throwing an instance of ‘JailContainerException’ what(): Error: 88: No JRE version parsed from/media/jzx/MATHWORKS_R2021A/sys /java/jre/glnxa64/jre/release   

慕羽★的博客 1万+

【异常】OpenClaw提示异常 1302:您的账户已达到速率限制,请您控制请求频率

摘要:系统返回1302错误码提示"账户已达到速率限制",表明请求频率超过服务阈值。主要原因是并发请求数达上限或请求过于密集。解决方案包括:降低并发请求量、引入请求队列机制平滑流量,或根据服务规则提升账户权益等级以获取更高并发额度。建议优先优化请求频率控制策略,避免触发系统限流机制。

奶爸的编程之路,也就一周冷个三天 1151

i++和++i傻傻分不清楚?这里给你最清楚的解答

本专栏是针对Java面试题打造的一款专栏,每篇文章对应一个面试的常见问题,希望对大家有所帮助。 本篇文章将介绍——自增变量,这是面试常见的问题,说难不难,说简单也不简单,需要面试者冷静思考,判断正确符号之间的优先级。 看下面的一个程序: @Test public void test1(){ int i = 1; i = i++; int j = i++; int k = i...

。。。 4566

PointNet++改进策略目录

后续我将如何使用文章中创新点加入的PointNet++中代码实现部分进行更新。

u012901740的博客 2198

【常见面试题】java自增 i++与++i

【小石头的茅坑】 71万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

i++与++i

i++与++i之间的区别i++与++i之间的区别 本文是我个人理解之作,如有分析不对的地方,请指出 i++与++i之间的区别 之前面试的时候,只知道i++是先复制,后做自增运算,++i 是先自增后赋值,看完本篇文章就知道其中区别 i++ :i= i; i= i+1; ++i :i= i+1;i= i; 这是做自增或者自减的操作步骤,但是底层执行与上写是不一样的,且优先级来说 ++ 优先与四则运算(= - * /) 像要了解两者的却别,需要先了解jvm底层关于其操作 我们的方法实在栈中进行的,栈的规则就是“

weixin_42544153的博客 239

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

关于Java中a++和++a的区别

                 关于Java中a++和++a的区别这篇文章是给刚接触Java的人看的,高手请忽略。初学Java的同学可能会对这两者有点懵逼,搞不清楚他俩的区别,尤其在一些计算题中。在讲这个问题之前,大家先看一个题目不知道大家是否看一眼是否就已经有了答案,不管大家的答案是什么,我想告诉大家的是正确答案是9和11,首先说i++的原理,i++这个运算符是先参与运算自身的值再自加1,而+...

MrXi 3万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java运算符优先级

i++类的面试题注意运算符的优先级 1.下列程序输出的结果是多少? public class Test34 { static { int x = 5; } static int x,y; public static void main(String[] args) { x--; myMethod(); System.out.println(x + y++ +x); } public sta...

qq_40764966的博客 224

java中i++与++i知识点

一、中间缓存变量机制 1.下列程序输出结果是 public class Test4 { public static void main(String[] args) { int j = 0; for(int i =0;i<100;i++) { j=j++; } System.out.println(j); } } 结果为 j=0 Java用了中间缓存变量机制,所以 j= j++ 可换成如下写...

qq_40764966的博客 367

java基础面试题之:i++与++i的区别

源代码 int i = 0; i = i++; System.out.println(i); int j=5; j=++j; System.out.println(j); 反编译: i++内存表现: Code: 0: iconst_0 1: istore_1 2: i...

weixin_30888027的博客 331

C语言自增/自减运算符:从原理到实战,彻底搞懂i++与++i

自增(++)和自减(--)运算符是C语言中用于变量值递增递减的一元运算符,其核心原理在于前置与后置形式对求值顺序和副作用发生时机的影响不同。理解这一机制对于编写高效、安全的底层代码至关重要,尤其在嵌入式开发、系统编程和算法实现等场景中。本文通过大量可运行的代码示例,深入解析了自增运算符在表达式求值、指针运算和循环控制中的经典应用与常见陷阱,帮助你规避因未定义行为导致的程序错误,提升代码质量。

cuemes08808的博客 555

Java算术运算符、关系运算符、逻辑运算符、赋值运算符详解与优先级关系

算术运算符、关系运算符、逻辑运算符、赋值运算符详解与优先级关系一、算术运算符二、关系运算符三、逻辑运算符四、赋值运算符 四种运算符优先级关系: 算术运算符>关系运算符>逻辑运算符>赋值运算符 一、算术运算符 public static void main(String[] args){ //除号: / int q = 12; int w = 5; double result1 = q / w;// 2.0 double result3 = q /

weixin_43514899的博客 1万+

java i 和 i的面试题_i++和++i问题输出详解(面试)

i++和++i问题,每次刷面试题都能看到也有好多人在问今天就详细的整理下首先先了解下运算符号的优先级i++和++i的区别(1)i++简单来说就是先用i的值来参加表达式的计算,然后再自加1i=4;a=i++; //此时,先做a=i=4,再做i++,故a=4,i=5(2)++i则是先自增1,再用自加后的值来做运算。i=4;a=++i; //此时,先做++i=5,再做a=++1,故a=5,i=5单看起来...

weixin_42473904的博客 581

深入解析i++与++i:从语法到性能优化

自增运算符(++)是编程中的基础操作符,分为前置(++i)和后置(i++)两种形式。从原理上看,前置递增先执行加1操作再返回值,后置递增则先返回值再执行加1,这一差异在字节码层面有明确体现。虽然两者在简单场景下的性能差异已被现代编译器优化,但在迭代器重载或并发环境下仍需特别注意。理解这些细微差别对编写高效、线程安全的代码至关重要,特别是在STL迭代器操作和金融系统等对性能与准确性要求较高的场景中。通过分析常见编码陷阱和跨语言实现差异,开发者可以避免竞态条件等问题,提升代码质量。

weixin_34152820的博客 405

i++ 和++i 的理解 以防面试

根本原理: //模拟 a++ function afterAdd(){ var temp = a; a = a+1; return temp; } //模拟++a; function beforeAdd(){ a = a+1; return a; } 所以网上找了几个面试题,大家看看: 题目一:输出i的值是多少? public void test(...

weixin_30516243的博客 111
上一篇: 计算机网络之数据链路层原理
下一篇: java面试题之类的初始化和实例化
Galen-gao
博客等级 码龄9年 931粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值