A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周易 中级黑马   /  2014-8-15 01:12  /  1835 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

http://bbs.itheima.com/thread-136901-1-1.html   这是上次的不通过第三方变量来交换两个数的值。其实这样的方法很愚蠢,效率不高。认真研习了指针可以更好的用这样的方法去解决以上问题。其关键代码如下:
void jh(char *a,char *b)
        {char y;
          y=*a;
          *a=*b;
       *b = y;
}
jh(&a,&)

9 个回复

倒序浏览
这还是用了第三个变量啊亲
回复 使用道具 举报
我觉得所有的两变量交换法都挺愚蠢的,可读性差不说,局限性还很大
回复 使用道具 举报
对啊,这个y不还是第三个变量嘛……
回复 使用道具 举报
本帖最后由 xiniuniu 于 2014-8-16 09:01 编辑

简单就是好的,我感觉 这样的交换不错,我们一眼就可以看出,是两个变量中的数据进行交换

同样不用第三方变量进行交换比较效率的还是使用异或的特性

  1. #include <stdio.h>

  2. int main(int argc, const char * argv[])
  3. {

  4.     int a = 100;
  5.     int b = 200;
  6.     printf("交换前a = %d , b = %d\n", a, b);
  7.    
  8.     a ^= b;
  9.     b ^= a;
  10.     a ^= b;
  11.    
  12.     printf("交换后a = %d , b = %d\n", a, b);
  13.     return 0;
  14. }
复制代码


虽然这个程序比较效率但可读性要差了一些。原理示例:如果a = 110b;  b = 010b;(b表示二进制)

   110 (a)
^ 010 (b)       ------>第一次异或  a = 100 ;  b= 010;

   010 (b)
^ 100 (a)    ------>第二次异或  a = 100;  b= 110;


   100 (a)
^ 110 (b)  ------>第三次异或  a = 010 ;  b= 110;

回复 使用道具 举报
晕。。。。之前看过一个,楼上这个貌似可以的。但是要注意,别连起来,否则不同的编译器出的结果是不一样的
回复 使用道具 举报
Meniny 发表于 2014-8-16 08:59
晕。。。。之前看过一个,楼上这个貌似可以的。但是要注意,别连起来,否则不同的编译器出的结果是不一样的 ...

不连起来是什么意思?
回复 使用道具 举报
Meniny 中级黑马 2014-8-16 09:08:05
8#
xiniuniu 发表于 2014-8-16 09:03
不连起来是什么意思?

就是不要写成:
  1. a ^= b ^= a ^=b;
复制代码

因为这样试图在序列点之间两次修改变量a,这种做法是未定义的,在不同的编译器下可能会出现不同结果,比如icc
回复 使用道具 举报
Meniny 发表于 2014-8-16 09:08
就是不要写成:

因为这样试图在序列点之间两次修改变量a,这种做法是未定义的,在不同的编译器下可能会 ...

所以我把三次操作都分开了。这样写法太晕了。编程中一行中最好只写一条语句
回复 使用道具 举报
xiniuniu 发表于 2014-8-16 09:28
所以我把三次操作都分开了。这样写法太晕了。编程中一行中最好只写一条语句 ...

嗯,是这样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马