这个问题就是: 怎样不使用第三个变量交换两个变量的值? 一般我们交换两个变量的值,一般使用一个中间变量,例如下面的例子:
int a = 1, b =2; //交换的方法,借用第三个变量temp int temp = 0; temp = a; a = b; b = temp;这个应该是都明白的方法了。 但是这个方法借用了第三个变量。 怎样能够做到不使用第三个变量就能够交换这两个变量呢?
确实,这些方法我看过之后都觉得挺好的,我觉的大开眼界,决定以后用到的时候试试看。 并且上面的方法都是使用Java语言写的,这个一般人都能够看出来。
由于上面的方法感觉不错,因此在一次做一个小的程序实验的时候就很想试试。 这个次测试的语言是C++语言的,软件的环境是Qt5.7.1,使用的编译器是MinGW。 在程序中,我写了如下的语句:
val1 = val0 + (val0 = val1) - val1;于是,发生的一个很蛋疼的问题,它们居然没有交换成功。 在我的感觉里面,这个应该可以啊,并且我觉得这样写没有问题。 于是,我在网上找到了0.2.1小结里面写的那个,将代码换成下面的样子:
val1 = val0 + val1 - (val0 = val1);其实,我就是觉得不甘心,就那么一测试,居然可以,所以测底觉得蛋疼。 于是,我写了下面的笔记: 在我的感知里面,它们执行的结果怎么都应该是一样的,总觉的上面的东西有问题。 于是,我就开始了下面的测试
下面是我的测试源程序:
#include <iostream> void test1(); void test2(); int main() { test1(); std::cout << "--------------" << std::endl; test2(); return 0; } void test1() { int val0 = 4, val1 = 9; std::cout << " 测试:" << "val1 = val0 + (val0 = val1) - val1" << std::endl; std::cout << " 初始化的值:" << std::endl; std::cout << "val0 = " << val0 << std::endl; std::cout << "val1 = " << val1 << std::endl; val1 = val0 + (val0 = val1) - val1; std::cout << " 转换后的值:" << std::endl; std::cout << "val0 = " << val0 << std::endl; std::cout << "val1 = " << val1 << std::endl; } void test2() { int val0 = 4, val1 = 9; std::cout << " 测试:" << "val1 = val0 + val1 - (val0 = val1)" << std::endl; std::cout << " 初始化的值:" << std::endl; std::cout << "val0 = " << val0 << std::endl; std::cout << "val1 = " << val1 << std::endl; val1 = val0 + val1 - (val0 = val1); std::cout << " 转换后的值:" << std::endl; std::cout << "val0 = " << val0 << std::endl; std::cout << "val1 = " << val1 << std::endl; }测试的结果如下:
娴嬭瘯锛歷al1 = val0 + (val0 = val1) - val1 鍒濆鍖栫殑鍊硷細 val0 = 4 val1 = 9 杞崲鍚庣殑鍊硷細 val0 = 9 val1 = 9 -------------- 娴嬭瘯锛歷al1 = val0 + val1 - (val0 = val1) 鍒濆鍖栫殑鍊硷細 val0 = 4 val1 = 9 杞崲鍚庣殑鍊硷細 val0 = 9 val1 = 4没错,你看的没错,执行的结果中,中文就是乱码。 但是可以方便看出执行的结果:
有一个交换成功了 有一个交换失败了
如图所示: 出任所料,执行的结果是:
全部执行失败
这个直接使用的是1.2里面的源代码重新编译的,但是由于里面有中文,就直接崩溃了,里面显示缺少分号什么的问题一大堆,直接将一份好的代码复制进去,就基本OK了,编译的结果如上。 这个结果是跟1.3的结果是一样的:
两个都执行失败
将他们写在一起的主要原因是: 它们执行的效果一样。 执行的结果是:
全部可以执行
很明显,跟使用什么的语言没有关系 最多,就是使用的编译器不一样导致的
我只能有如下的感叹了: 1 程序要写的尽量明白 2 程序要写的尽量明白,别老简写 3 程序要写的尽量明白,写的人容易看懂,给写编译器的人就越少可能产生不同
