社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 652|回复: 9

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

[复制链接]

5339

TA的帖子

159

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-13 10:01:18 | 显示全部楼层 |阅读模式
本帖最后由 lcofjp 于 2017-9-13 18:10 编辑
  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


注意:这段代码在某些平台不能正确运行
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

5027

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-13 10:59:14 | 显示全部楼层
我遇到一个函数是下边这样,注释掉的部分使用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. }
复制代码


点评

是的,一个语句出现同一个变量的赋值和使用有警告是正常的,所以我说这是烂代码,就像那种傻逼的试题一样,一个语句同时包含多个i++,++i这种东西。  详情 回复 发表于 2017-9-13 15:34
虾扯蛋


回复

使用道具 举报

4164

TA的帖子

9

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2017-9-13 14:59:55 | 显示全部楼层
我个人觉得异或运算还是比较不错的。。。。。。。。

点评

嗯,喜欢不需要理由,我不喜欢是因为它既不直观,效率也不高  详情 回复 发表于 2017-9-13 15:37


回复

使用道具 举报

5339

TA的帖子

159

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-9-13 15:34:03 | 显示全部楼层
littleshrimp 发表于 2017-9-13 10:59
我遇到一个函数是下边这样,注释掉的部分使用IAR编译有警告,能正常运行,分开写警告消失“Warning: undefi ...

是的,一个语句出现同一个变量的赋值和使用有警告是正常的,所以我说这是烂代码,就像那种傻逼的试题一样,一个语句同时包含多个i++,++i这种东西。
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

5339

TA的帖子

159

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-9-13 15:37:06 | 显示全部楼层
huaiqiao 发表于 2017-9-13 14:59
我个人觉得异或运算还是比较不错的。。。。。。。。

嗯,喜欢不需要理由,我不喜欢是因为它既不直观,效率也不高

点评

效率还真没仔细考量过呢。。。。。。惭愧。。。。。。。。。。  详情 回复 发表于 2017-9-13 15:57
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

4164

TA的帖子

9

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2017-9-13 15:57:17 | 显示全部楼层
lcofjp 发表于 2017-9-13 15:37
嗯,喜欢不需要理由,我不喜欢是因为它既不直观,效率也不高

效率还真没仔细考量过呢。。。。。。惭愧。。。。。。。。。。

点评

[attachimg]321202[/attachimg][attachimg]321203[/attachimg] [attachimg]321204[/attachimg] 楼主位的代码由于在某些平台不能正确执行,不具有可移植性,所以不列出比较。  详情 回复 发表于 2017-9-13 18:08


回复

使用道具 举报

5339

TA的帖子

159

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-9-13 18:08:17 | 显示全部楼层
本帖最后由 lcofjp 于 2017-9-13 18:15 编辑
huaiqiao 发表于 2017-9-13 15:57
效率还真没仔细考量过呢。。。。。。惭愧。。。。。。。。。。

swap1.jpg swap2.jpg
swap3.jpg

楼主位的代码由于在某些平台不能正确执行,不具有可移植性,所以不列出比较。
这是用windows平台下的visual c++的编译结果,如果有其他平台的结果,欢迎列出,尤其是用异或的方法更具有简洁的底层代码,也欢迎用异或的方式自己用汇编实现交换变量与直接用MOV进行对比。

点评

厉害了,队长。。。。这是我见过你回过的最不水的帖子了。。。。 哈哈,开玩笑的。感谢队长的回复呢  详情 回复 发表于 2017-9-13 18:16
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

4164

TA的帖子

9

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2017-9-13 18:16:40 | 显示全部楼层
lcofjp 发表于 2017-9-13 18:08
楼主位的代码由于在某些平台不能正确执行,不具有可移植性,所以不列出比较。
这是用windows平台 ...

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

哈哈,开玩笑的。感谢队长的回复呢


回复

使用道具 举报

7674

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-11-13 19:20:15 | 显示全部楼层
必须MARK


回复

使用道具 举报

7674

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-11-13 19:20:54 | 显示全部楼层
我没分了——我最喜欢队长发这种小题目了


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-6-25 06:07 , Processed in 0.277015 second(s), 18 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表