社区导航

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

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

[复制链接]

5126

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

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

[C] 纯文本查看 复制代码
#include <stdio.h>

int main(int argc, const char * argv[]) {
    // insert code here...
    int a = 12, b = 34;
    a = a ^ b ^ (b=a);
    printf("a=%d, b=%d\n", a, b);
    return 0;
}

这段代码在我的电脑可以正确运行,但是,这并不意味着什么,贴出这段代码并不是要大家模仿,因为我觉得这句代码很烂,但是我觉得这段代码要高于那种用三个异或语句的交换程序,美其名曰不用第三个变量。其实最简单实用的就是借助一个临时变量直接赋值的。
代码出处:https://github.com/kdn251/interviews/blob/master/README-zh-cn.md


注意:这段代码在某些平台不能正确运行
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

4454

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


[C] 纯文本查看 复制代码
void reverse(char *str)
{
     int16_t i , j;
     int16_t len = strlen(str);
     for( i = 0 , j = len - 1 ; i < j ; i++ , j--)
     {
         //str[i]^=str[j]^=str[i]^=str[j];
         str[i]^=str[j];
         str[j]^=str[i];
         str[i]^=str[j];
     }
}


点评

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


回复

使用道具 举报

3843

TA的帖子

8

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

测评达人

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

点评

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


回复

使用道具 举报

5126

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

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

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


回复

使用道具 举报

5126

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

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

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

点评

效率还真没仔细考量过呢。。。。。。惭愧。。。。。。。。。。  详情 回复 发表于 2017-9-13 15:57
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

3843

TA的帖子

8

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

测评达人

发表于 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


回复

使用道具 举报

5126

TA的帖子

73

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,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

3843

TA的帖子

8

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

测评达人

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

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

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


回复

使用道具 举报

7511

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

爱原创

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


回复

使用道具 举报

7511

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

爱原创

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


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2017-11-22 05:28 , Processed in 0.397602 second(s), 26 queries , Redis On.

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