递增(++)和递减(--)运算

博客指出Java代码i = i++可能带来问题,i--和--i递减同理。还给出一个面试题的代码对应的字节码解析,如将8放入栈、存储到局部变量等操作。同时说明查看字节码需在idea中安装jclasslib插件。
++在前叫前缀递增,++在后叫后缀递增。
/**
 * @author rll
 * @description: 递增和递减
 * @date 2020/12/26 16:44
 */
public class DiZengDiJian {
    public static void main(String[] args) {
        int i = 1;
        System.out.println("i++时,先生成值,再执行运算");
        System.out.println(i++);//先生成值,i是1,所以输出1;在这之后执行i=i+1,i变为2.
        System.out.println(i);

        i=1;
        System.out.println("++i时,先执行运算,再生成值");
        System.out.println(++i);//先运算i=i+1,i变2了,所以输出2
        System.out.println(i);
        //++在前叫前缀递增,++在后叫后缀递增
        //--递减同理可自己尝试
    }
}

 

所以如果你有代码是i = i++;很有可能把自己坑死,更有可能被其他人打死。

i--和--i递减同理可自己尝试。

 

一个面试题

    public static void main(String[] args) {
        int a =8;
        a = a++;
        System.out.println(a);
    }

这段代码对应的字节码解析(开头的数字可以忽视)

 0 bipush 8        把8放到栈里
 2 istore_1        把栈顶的数[8]存储到编号为1的局部变量里   (局部变量编号0是args,编号1是a)   到这里执行完a=8
 3 iload_1         把编号1的局部变量放到栈中(放入后栈中有两个8)
 4 iinc 1 by 1     把局部变量编号1执行+1     进行+1的是局部变量,不是栈中数据    这里执行a++
 7 istore_1        把栈顶的数[8]存储到编号为1的局部变量里   (a最终等于8)

上述查看方式,需要在idea中安装jclasslib插件,安装完成后依次点击"View"->"show Bytecode with jclasslib"

 

<think>嗯,用户想实现一个分数计算器的代码,支持加减乘除还有前置后置的++--操作。首先,我得想清楚分数在代码里怎么表示。通常分数有分子分母,所以需要一个类来封装这两个属性,比如Fraction类。然后,加减乘除这些运算需要重载运算符,比如+、-、*、/,这样用户可以直接用运算符操作分数对象。接下来是前置后置的++--。根据引用[1]里的说明,递增递减运算符作用于变量、数组元素或对象属性,前置是先增减再赋值,后置是先赋值再增减。所以在Fraction类里,我需要重载前置++后置++,以及前置--后置--。前置的可能返回引用,后置的需要保存旧值再返回。然后,分数的运算要考虑约分,比如每次运算后要找到最大公约数来简化分数。同时,分母不能为零,所以构造函数里需要处理分母为零的情况,可能抛出异常。还有,分数的加减法需要通分,找到最小公倍数,然后调整分子相加或相减。乘法的话直接分子乘分子,分母乘分母,再约分。除法则是乘以倒数,同样注意分母不能为零。在实现运算符重载的时候,要注意C++的语法,比如重载+=的话,可以先实现+=,再基于它实现+,这样代码更简洁。同样,前置++是修改自身后返回*this,而后置++需要一个临时对象保存原来的值,再自增,返回临时对象。测试部分,用户可能需要写一些测试用例,验证各个运算符的正确性,比如分数加法是否正确,++--是否按前置后置正确执行。另外,引用[4]提到C++的Date类实现了运算符重载,包括比较加减,这可以作为参考,如何结构化组织代码。比如,比较运算符重载可以用来比较两个分数的大小,而加减乘除则处理运算。还有,用户可能需要注意代码的异常处理,比如分母为零的情况,或者在除法时除数为零的情况,这时候需要抛出错误提示。最后,代码的可读性注释也很重要,确保每个方法的功能清晰,特别是运算符重载的部分,可能需要详细注释说明其行为。</think>以下是一个支持分数加减乘除及自增自减操作的C++实现方案,结合运算符重载技术实现: ```cpp #include <iostream> #include <stdexcept> using namespace std; class Fraction { private: int numerator; // 分子 int denominator; // 分母 // 最大公约数(用于约分) int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } // 约分处理 void reduce() { int common = gcd(abs(numerator), abs(denominator)); numerator /= common; denominator /= common; if(denominator < 0) { // 保证分母始终为正 numerator *= -1; denominator *= -1; } } public: Fraction(int num = 0, int den = 1) { if(den == 0) throw invalid_argument("分母不能为零"); numerator = num; denominator = den; reduce(); } // 加法运算符重载 Fraction operator+(const Fraction& other) const { return Fraction( numerator * other.denominator + other.numerator * denominator, denominator * other.denominator ); } // 减法运算符重载 Fraction operator-(const Fraction& other) const { return Fraction( numerator * other.denominator - other.numerator * denominator, denominator * other.denominator ); } // 乘法运算符重载 Fraction operator*(const Fraction& other) const { return Fraction( numerator * other.numerator, denominator * other.denominator ); } // 除法运算符重载 Fraction operator/(const Fraction& other) const { if(other.numerator == 0) throw invalid_argument("除数不能为零"); return Fraction( numerator * other.denominator, denominator * other.numerator ); } // 前置++ Fraction& operator++() { numerator += denominator; reduce(); return *this; } // 后置++ Fraction operator++(int) { Fraction temp = *this; ++(*this); return temp; } // 前置-- Fraction& operator--() { numerator -= denominator; reduce(); return *this; } // 后置-- Fraction operator--(int) { Fraction temp = *this; --(*this); return temp; } // 输出运算符重载 friend ostream& operator<<(ostream& os, const Fraction& f) { if(f.denominator == 1) os << f.numerator; else os << f.numerator << "/" << f.denominator; return os; } }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值