[讨论] 一个语句交换整形变量

lcofjp   2017-9-13 10:01 楼主
  1. #include <stdio.h>
  2. int main(int argc, const char * argv[]) {
  3. // insert code here...
  4. int a = 12, b = 34;
  5. a = a ^ b ^ (b=a);
  6. printf("a=%d, b=%d\n", a, b);
  7. return 0;
  8. }
这段代码在我的电脑可以正确运行,但是,这并不意味着什么,贴出这段代码并不是要大家模仿,因为我觉得这句代码很烂,但是我觉得这段代码要高于那种用三个异或语句的交换程序,美其名曰不用第三个变量。其实最简单实用的就是借助一个临时变量直接赋值的。 代码出处:https://github.com/kdn251/interviews/blob/master/README-zh-cn.md 注意:这段代码在某些平台不能正确运行 本帖最后由 lcofjp 于 2017-9-13 18:10 编辑

回复评论 (9)

我遇到一个函数是下边这样,注释掉的部分使用IAR编译有警告,能正常运行,分开写警告消失“Warning[Pa079]: undefined behavior: parameter "str" (declared at line 1152) (or a value reached by some form of indirection through it) is modified more than once  ....main.c 1158 without an intervening sequence point in this statement


  1. void reverse(char *str)
  2. {
  3.      int16_t i , j;
  4.      int16_t len = strlen(str);
  5.      for( i = 0 , j = len - 1 ; i < j ; i++ , j--)
  6.      {
  7.          //str[i]^=str[j]^=str[i]^=str[j];
  8.          str[i]^=str[j];
  9.          str[j]^=str[i];
  10.          str[i]^=str[j];
  11.      }
  12. }


虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2017-9-13 10:59
我个人觉得异或运算还是比较不错的。。。。。。。。
点赞  2017-9-13 14:59
引用: littleshrimp 发表于 2017-9-13 10:59
我遇到一个函数是下边这样,注释掉的部分使用IAR编译有警告,能正常运行,分开写警告消失“Warning: undefi ...

是的,一个语句出现同一个变量的赋值和使用有警告是正常的,所以我说这是烂代码,就像那种傻逼的试题一样,一个语句同时包含多个i++,++i这种东西。
点赞  2017-9-13 15:34
引用: huaiqiao 发表于 2017-9-13 14:59
我个人觉得异或运算还是比较不错的。。。。。。。。

嗯,喜欢不需要理由,我不喜欢是因为它既不直观,效率也不高
点赞  2017-9-13 15:37
引用: lcofjp 发表于 2017-9-13 15:37
嗯,喜欢不需要理由,我不喜欢是因为它既不直观,效率也不高

效率还真没仔细考量过呢。。。。。。惭愧。。。。。。。。。。
点赞  2017-9-13 15:57
引用: huaiqiao 发表于 2017-9-13 15:57 效率还真没仔细考量过呢。。。。。。惭愧。。。。。。。。。。
swap1.jpg swap2.jpg swap3.jpg 楼主位的代码由于在某些平台不能正确执行,不具有可移植性,所以不列出比较。 这是用windows平台下的visual c++的编译结果,如果有其他平台的结果,欢迎列出,尤其是用异或的方法更具有简洁的底层代码,也欢迎用异或的方式自己用汇编实现交换变量与直接用MOV进行对比。 本帖最后由 lcofjp 于 2017-9-13 18:15 编辑
点赞  2017-9-13 18:08
引用: lcofjp 发表于 2017-9-13 18:08
楼主位的代码由于在某些平台不能正确执行,不具有可移植性,所以不列出比较。
这是用windows平台 ...

厉害了,队长。。。。这是我见过你回过的最不水的帖子了。。。。

哈哈,开玩笑的。感谢队长的回复呢
点赞  2017-9-13 18:16
必须MARK
点赞  2017-11-13 19:20
我没分了——我最喜欢队长发这种小题目了
点赞  2017-11-13 19:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复