i += i > 0 ? i++ : i--; 运算逻辑的深入思考

本文深入解析了一道Java运算题,通过反编译代码并解读JVM指令,详细解释了i>0?i++:i--运算符的执行顺序及结果,揭示了看似简单的表达式背后的复杂逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天看到一道有趣的java运算题,如下图;

输出结果呢?本屌感觉不会那么简单但是也看不透彻,姑且猜测为0,程序输出果然为0;

先心底暗爽一下毕竟蒙对了也是一种运气(o不实力的体现,自我安慰)


但是搞不懂心理有死结就决定一探究竟。 从代码字面来看结果为0的计算顺序应该是

先执行(i>0?i++:i--)  后执行 (i+=(i>0?i++:i--))>0?i++:i--  ;

到这姑且多少学到了一些东西,但是感觉还有一层迷雾遮盖着真相,想到之前的类似 的题目

i=i++和i=++i这样的问题,反编译代码查看jvm的指令以及顺序更能透彻理解所以把这个类反编译了之后如下

static void test();
    Code:
       0: iconst_0                       //int类型的常量0入栈
       1: istore_0                       //int类型的常量0存储赋值 既 i=0
       2: iload_0                        //将常量0推至栈顶 既i+ =中i索引0 的常量值
       3: iload_0                        //将常量0推至栈顶 既是 i>0 中i索引0的常量值  
       4: ifle          14               // ifle 是jvm指令常量小于等于0时跳转执行到指令号 14
       7: iload_0                        //继续执行推栈操作 一直代表的i这个常量 
       8: iinc          0, 1             //iinc 是常量自增 代表 指令号为0 的常量值加1既是i++
      11: goto          18               //无条件跳转到指令号为18
      14: iload_0                        //第4指令号为真 执行当前指令 将常量0推至栈顶 
      15: iinc          0, -1            //i+=i之后大于0 所以执行i--  自增为-1 即为0
      18: iadd                           //这一步执行 i+=i  
      19: istore_0                        //存储赋值  既将 指令号为0的常量值重新赋值
      20: getstatic     #2                  // Field 
                                             java/lang/System.out:Ljava/io/PrintStream;
      23: iload_0
      24: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      27: return
     
       20 23 24 27 大家可以去看jvm指令集,不一一赘述,怕有误导
      

对于jvm指令和执行步骤的简单注释,深层本屌也不太懂,写多了怕挨喷。

有错误请大神多多指正,感激不尽!!

修改代码#include <stdio.h> #include <stdlib.h> #include <math.h> // 定义多项式结构体 typedef struct { int degree; double* coefficients; } Polynomial; // 计算多项式的值 double evaluatePolynomial(Polynomial p, double x) { double result = 0.0; for (int i = p.degree; i >= 0; i--) { result += p.coefficients[p.degree - i] * pow(x, i); } return result; } // 二分法 double bisection(Polynomial p, double a, double b, double tol) { double mid; while ((b - a) >= tol) { mid = (a + b) / 2; if (evaluatePolynomial(p, mid) == 0.0) { return mid; } else if (evaluatePolynomial(p, mid) * evaluatePolynomial(p, a) < 0) { b = mid; } else { a = mid; } } return mid; } // 牛顿下山法 double newtonDescent(Polynomial p, double initialGuess, double tol, int maxIter) { double x = initialGuess; double alpha = 0.001; // 步长因子 double beta = 0.0008; // 步长缩减因子 for (int i = 0; i < maxIter; i++) { double fx = evaluatePolynomial(p, x); double dfx = 0.0; for (int j = p.degree - 1; j >= 0; j--) { dfx += p.coefficients[p.degree - j] * (j + 1) * pow(x, j); } if (dfx == 0.0) { printf("导数为零,无法继续。\n"); return x; } double x_new = x - alpha * fx / dfx; // 检查是否下降 if (fabs(evaluatePolynomial(p, x_new)) < fabs(fx)) { x = x_new; } else { // 如果没有下降,缩小步长 alpha *= beta; } if (fabs(x_new - x) < tol) { return x_new; } } return x; } int main() { int n; printf("请输入未知数的最高次数: "); scanf_s("%d", &n); Polynomial p; p.degree = n; p.coefficients = (double*)malloc((n + 1) * sizeof(double)); printf("请输入每个项的系数,从最高次到常数项:\n"); for (int i = 0; i <= n; i++) { printf("系数 a[%d]: ", n - i); scanf_s("%lf", &p.coefficients[i]);
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值