免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2971 | 回复: 13
打印 上一主题 下一主题

[C] 想知道逗号在这个程序中做了什么实质性的改变。 [复制链接]

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-15 01:57 |只看该作者 |倒序浏览
首先是一个简单的“倒置字符串s中各个字符的位置”的程序
  1. #include<string.h>

  2. void reverse(char s[])
  3. {
  4.     int c, i, j;

  5.     for(i = 0, j = strlen(s)-1; i < j; i++, j--){
  6.         c = s[i];
  7.         s[i] = s[j];
  8.         s[j] = c;
  9.     }
  10. }
复制代码
之后,将循环体改成:
  1. for( i = 0, j = strlen(s)-1; i < j; i++, j--)
  2.     c = s[i], s[i] = s[j], s[j] = c;
复制代码
运用了逗号。
不过书里也说了,要慎用逗号。= =
请教各位大神,就是想知道,用了逗号之后,与原来的程序,有什么实质性可以体现出来的差别吗?

论坛徽章:
0
2 [报告]
发表于 2012-11-15 08:27 |只看该作者
回复 1# _HellAngel_
  1. 146:          c = s[i];
  2. 0040111D   mov         ecx,dword ptr [ebp+8]
  3. 00401120   add         ecx,dword ptr [ebp-8]
  4. 00401123   movsx       edx,byte ptr [ecx]
  5. 00401126   mov         dword ptr [ebp-4],edx
  6. 147:          s[i] = s[j];
  7. 00401129   mov         eax,dword ptr [ebp+8]
  8. 0040112C   add         eax,dword ptr [ebp-8]
  9. 0040112F   mov         ecx,dword ptr [ebp+8]
  10. 00401132   add         ecx,dword ptr [ebp-0Ch]
  11. 00401135   mov         dl,byte ptr [ecx]
  12. 00401137   mov         byte ptr [eax],dl
  13. 148:          s[j] = c;
  14. 00401139   mov         eax,dword ptr [ebp+8]
  15. 0040113C   add         eax,dword ptr [ebp-0Ch]
  16. 0040113F   mov         cl,byte ptr [ebp-4]
  17. 00401142   mov         byte ptr [eax],cl
  18. 149:      }
  19. 00401144   jmp         reverse+33h (00401103)
复制代码
  1. 152:          c = s[i], s[i] = s[j], s[j] = c;
  2. 0040111D   mov         ecx,dword ptr [ebp+8]
  3. 00401120   add         ecx,dword ptr [ebp-8]
  4. 00401123   movsx       edx,byte ptr [ecx]
  5. 00401126   mov         dword ptr [ebp-4],edx
  6. 00401129   mov         eax,dword ptr [ebp+8]
  7. 0040112C   add         eax,dword ptr [ebp-8]
  8. 0040112F   mov         ecx,dword ptr [ebp+8]
  9. 00401132   add         ecx,dword ptr [ebp-0Ch]
  10. 00401135   mov         dl,byte ptr [ecx]
  11. 00401137   mov         byte ptr [eax],dl
  12. 00401139   mov         eax,dword ptr [ebp+8]
  13. 0040113C   add         eax,dword ptr [ebp-0Ch]
  14. 0040113F   mov         cl,byte ptr [ebp-4]
  15. 00401142   mov         byte ptr [eax],cl
  16. 00401144   jmp         reverse+33h (00401103)
复制代码
两种情况用VC反汇编结果是一样的,书上说注意使用逗号,个人理解应该是指在复杂的表达式中使用,
有可能造成你以为的优先级与实际的优先级不一致。只要优先级及从左到右或从右到左都理解正确是可以使用的,
只是记这些比较麻烦而已。在本例中显然没有问题,比较简单。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2012-11-15 09:21 |只看该作者
没有任何问题,逗号本身也含个序列点

论坛徽章:
0
4 [报告]
发表于 2012-11-15 10:23 |只看该作者
逗号表达式有个返回值的...

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
5 [报告]
发表于 2012-11-15 10:49 |只看该作者
回复 2# skychgg


用的不是vc,有没有gcc howto??

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
6 [报告]
发表于 2012-11-15 12:48 |只看该作者
回复 4# ahui886

返回值?
   

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
7 [报告]
发表于 2012-11-15 12:53 |只看该作者
回复 2# skychgg

看不懂反汇编= =。。不过结果看到了。。= =。。。恩。。。谢谢。。。这个例子貌似的确没什么问题。。
   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
8 [报告]
发表于 2012-11-15 14:08 |只看该作者
_HellAngel_ 发表于 2012-11-15 01:57
首先是一个简单的“倒置字符串s中各个字符的位置”的程序之后,将循环体改成:运用了逗号。
不过书里也说了 ...

这个问题不必较真了吧?方便而已。

论坛徽章:
0
9 [报告]
发表于 2012-11-19 16:30 |只看该作者
很明显的作用嘛,减少了程序的行数。

论坛徽章:
0
10 [报告]
发表于 2012-11-20 17:08 |只看该作者
这就像问 a=a+++++a 的含义。
这是未定义行为,压根不该出现。用逗号和用分号的区别在于:
用分号是对的,用逗号是错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP