主要思路是用其中一变量存储x,y的运算值,然后逆运算得到
- /****************************************************************/
- /***** 不借助第三方变量,交换两个整型数x和y的值 ****/
- /****************************************************************/
- void swap()
- {
- int x, y;
- x=5;
- y=10;
- /*函数声明,引用传地址但未用第三方变量*/
- void swap1(int &x, int &y); /* 方法1 */
- void swap2(int &x, int &y); /* 方法2 */
- void swap3(int &x, int &y); /* 方法3 */
- printf("\n原始值:x=%d, y=%d\n", x, y);
- swap3(x, y);
- printf("\n交换后:x=%d, y=%d\n", x, y);
- }
- /****************************************/
- /******* 方法1:算术运算(加减) *******/
- /****************************************/
- void swap1(int &x, int &y)
- {
- x=x+y; /* x存储x与y的和值(核心思想:x同时先把x和y两者的信息都存储下来) */
- y=x-y; /* 保持x内存和值不变,y先赋值,即减去y的原始值使其等于x原始的值 */
- x=x-y; /* 保持x内存和值不变,x再赋值,即减去y现在存储的原始x值,更新x值为原始y的值 */
- }
- /**************************************************************/
- /******* 方法2:算术运算(乘除、指数运算、三角运算等) *******/
- /**************************************************************/
- void swap2(int &x, int &y)
- {
- x=x*y; /* x存储x与y的积值,核心思想同方法1,x同时先把x和y两者的信息都存储下来,本方法以乘除为例 */
- y=x/y; /* 保持x内存积值不变,y先赋值,即除去y的原始值使其等于x原始的值 */
- x=x/y; /* 保持x内存积值不变,x再赋值,即除去y现在存储的原始x值,更新x值为原始y的值 */
- }
- /****************************************/
- /******* 方法3:逻辑运算(异或) *******/
- /****************************************/
- void swap3(int &x, int &y)
- {
- x^=y; /* x存储x与y的异或值(核心思想同上,即x先存储x和y两者信息(异或表示)) */
- y^=x; /* 保持x内存和值不变,y先赋值,即利用x异或反转y的原始值使其等于x原始的值 */
- x^=y; /* 保持x内存和值不变,x再赋值,即利用x异或反转y的原始值使其等于y原始的值 */
- }