首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么`i = ++ i + 1`未指明行为?

在编程语言中,i = ++i + 1这个表达式的具体行为是未指明的,因为它涉及到了对变量i的多次修改,这会导致不同编程语言的编译器或解释器产生不同的行为。

在这个表达式中,++i表示先对变量i进行自增操作,然后再将其结果与1相加。因为自增操作涉及到对变量的修改,所以这个表达式中的++i是一个具有副作用的操作。

在某些编程语言中,这种表达式可能会导致未定义的行为,因为它涉及到了对变量i的多次修改,而这些修改的顺序和时机是未指定的。这可能会导致不同的编译器或解释器产生不同的行为,从而导致程序的不稳定性和不可预测性。

因此,建议在编写程序时避免使用这种未指明行为的表达式,以免导致程序的不稳定性和不可预测性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

面试官:【int i = 6; i += i - 1; 】i 等于什么?

表达式解析:i += i - 1; 这一行等价于 i = i + (i - 1);。i - 1:当前 i 的值是 6,因此 i - 1 计算结果为 6 - 1 = 5。...为什么第一个 i 没有变成 5;要理解为什么 i 的值在表达式中不会中途变化,需要深入了解表达式求值的顺序和变量赋值的机制,尤其是在 Java 中是如何处理变量的。...Java 是一种严格从左到右求值的语言,这意味着:当执行 i += i - 1; 时,右侧表达式 i - 1 首先被计算,然后将结果赋值给 i。...延迟赋值:在表达式 i += i - 1 中,只有在 i + (i - 1) 的所有计算完成之后,结果 11 才会被赋值给 i。...这就是为什么即使执行了 i - 1 的计算,第一个 i 的值仍然保持为 6,直到所有运算结束。总结操作数栈 和 局部变量表 是 JVM 中两个不同的内存区域。

29320
  • 漫画:奇怪,为什么在Java中 2*(i*i) 比 2*i*i 快?

    但是如果你把 2*i*i 替换成 2*(i*i),执行时间大概在 0.50s ~ 0.55s。 对这段程序的两个版本分别执行 15 次,得到的结果如下。...我们可以看出 2*(i*i) 比 2*i*i 快 。 我们来分别查看它的字节码,这里东哥给我推荐了一款好用的 IDEA 插件,叫做 jclasslib bytecode viewer。...2*i*i 的字节码如下。 2*(i*i) 的字节码如下。 我们可以发现除了字节码顺序不同外,没有其它异常,下一步该怎么办呢?...我这里就说一下结论,通过对比分析,我们会发现,2*i*i 进行了大量的堆栈操作,因此,需要保存大量的中间结果;而 2*(i*i) 只有少量的堆栈操作。...显而易见,2*(i*i) 比 2*i*i 快是由于 JIT 优化的结果。 -END-

    79820

    ++i和i++仅仅是先加1和后加1的区别吗?

    那么第四个方法怎么就输出 i=15呢? 为什么会是15呢?按照通俗的见解,虽然后置++是先参与运算,然后再将值加1,但是执行对自身的赋值运算后,该值也加1,变成16才是呀。...况且,后置++对其他变量j赋值后,i自身也加1了, prePlus3:i=16,j=15 为什么对自己赋值后,结果就不一样呢? 实际上,不管是前置++还是后置++,都是先将变量的值加1....,这里局部变量1就是 //程序中的变量i,也就是将刚才压入栈的0弹出,赋值给变量i //这两个指令相当于执行(int i=0;) 1: istore_1 //将局部变量1中存储的int类型值压入栈,即将...i的值0压入栈, //这在程序中就相当于将i的值赋给一个临时变量temp,此时temp的值为0 2: iload_1 //将局部变量1的值加1,也就是将i的值加1.在程序中这个相当于(i+=1;) //...//这两天指令相当于执行(int i=0;) 1: istore_1 //将局部变量1的值加1.也就是将i的值加1.

    1.7K20

    i:=i 合法且常用? 为什么能解决闭包变量冲突?

    i:=i 合法?为什么能解决闭包变量冲突? 什么?你告诉我 i:=i 不仅合法,而且还常用。甚至能解决并发编程中的变量冲突?...sem 1 go func() { process(req) <-sem }() } } req := req...1. universe 全局 The universe block encompasses all Go source text. universe 这个词不怎听说, 但是换成 全局 这个概念还是很好理解的...因此推测(无实锤), 1. 存在 file block。2. 并且有高低等级之分。 其实很好理解, _test 是用于测试的, 肯定不能干扰主干程序的的环境。..., for block 的变量 i 被继承,并在 if block 中被修改, 所以结果是 loop: 0,1,2,9 当 35 行存在的时候, for block 中的变量 i 被 statement

    40410

    为什么百度世界大会上李彦宏又双叒叕讲人工智能?A!I!A!I!

    I!A!I!,All IN AI,李彦宏豪赌人工智能。 今天,2016年百度世界大会在“老地方”中国大饭店召开。2006年,百度登陆纳斯达克之后举办了首次百度世界大会,今年刚好是第十届。...Google AlphaGo战胜人类的背后是Google 在人工智能技术领域多年的默默耕耘,Google I/O大会上Google宣称人工智能是Google未来的大事,不论是Google Assitant...百度意识到人工智能技术的进一步成熟和全面普及,并不能凭一己之力,这是为什么这次邀请英伟达联合创始人兼CEO 黄仁勋做嘉宾并在李彦宏之后演讲的原因。 ?...为什么李彦宏又双叒叕要讲人工智能?答案很清晰了:百度则已从布局人工智能到All In AI,在全球科技巨头均在押注人工智能之时,百度正在抢先布局,AI能否帮助百度焕发第二春?拭目以待。

    74550

    为什么编程里习惯使用 i、j、k 等作为循环变量?

    i 可能是 integer 的简写,或者是 int 的简写。有人说是 iterator 的简写,这个有点牵强。早期教材中的示例都是以 i、k、j 作为循环变量,后来这样使用成为了一种习惯。...在 1957 年诞生的 Fortran 编程中,有一个「I—N 规则」,以字母 I,J,K,L,M,N 六个字母开头的变量,如无另外说明均为整型变量,以其它字母开头的变量则为实型变量。...Fortran 更多是一种教学语言,后来诞生的 B 语言、C 语言都借鉴了 i、k、j 的命名规则,久而久之成为了习惯。...关于 I-N 规则,可以查看这里:https://micro.ustc.edu.cn/Fortran/ZJDing/Sec1-4.htm Fortran 支持整型、字符型等类型。

    1.1K20
    领券