最近在学C++,由于大学的时候没有好好读书,所以学C++的时候感觉把记忆中很混淆的概念梳理了一下,再对比着自己现在工作用的Java,发现二者有很多相似和不同的地方,自己也不是一个爱写博客的人, 所以也就想到什么写点什么吧
一、C++ 和 Java 共通的交换方法
这里只介绍交换数据的方法,这个在C++ 和 Java 中操作的逻辑都是一样的,无外乎最常见的三种,使用中间变量,使用加法减法操作,使用位运算符,这里以C++的写法为主
1. 使用中间变量
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp
}
这种很通俗易懂,没什么可说的
2. 使用加减法
void swap(int &a, int &b)
{
a = a + b; // 把a和b的元素和赋给a
b = a - b; // a现在是两数和,减去b就是a,再赋给b,所以现在b是a的值
a = a - b; // a依然是两数和,b的值是a的值,两数和减去a的值还剩b的值,再把b的值赋给a
}
// 这样就完成了交换,好处是不用使用额外变量,缺点是如果数据太大会溢出
3. 使用位运算符
void swap(int &a, int &b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
这种写法就很抖机灵,不建议使用,因为如果两数相同,则会把数据都置零,实质就是两个数异或两次变成了对面的数,优点是非常的快,如果要用可以加一个判断,就很完美了
二、C++ 中交换两个变量的值
如果是使用函数封装交换变量数据的方法,C++和Java的操作还是不一样的,在C++中很好实现,直接使用指针或者引用的方式就可以取到数据地址,对数据进行操作
void swap(int* p1, int* p2) { // do something...}
void swap2(int &a, int &b) { // do something...}
而在Java中,则不可以直接对地址进行操作,所以Java中的参数列表如果像这样,则无法完成交换
public static void swap(int a, int b) { // do something... }
调用这个函数只能在这个函数中完成交换,无法改变原先函数中的值。平常我们在写排序算法得时候,使用函数之所以能完成交换,是因为大部分情况下传入得参数列表是两个数组元素,而在Java中数组元素是按址传递的,因此可以交换成功,像这样
public static void swap(int[] arr, int i, int j) { // do something... }
那么问题来了,如果在Java中传入的参数不是数组,而是需要直接交换两个变量怎么办?这里就可以采用对象的方式进行操作,即把对象放类里面
public class test {
public static class NumberClass {
private int a = 10;
private int b = 20;
}
public static void main(String[] args) {
NumberClass nc = new NumberClass();
swap(nc);
System.out.println("主函数中");
System.out.println("a = " + nc.a + ", b = " + nc.b);
}
public static void swap(NumberClass nc) {
int temp;
temp = nc.a;
nc.a = nc.b;
nc.b = temp;
System.out.println("swap函数中");
System.out.println("a = " + nc.a + ", b = " + nc.b);
}
}
采取传入对象的方式即可,因为数组,对象都是按址传递的