• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

外星代码生成术之逗号运算符

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 13次 | 进入软件测试论坛讨论

领测软件测试网  

外星代码生成术之逗号运算符

 

缩减代码不意味着增加可读性,恰恰相反,过分的缩减代码反而会使代码更难懂,难以维护。本文不提倡滥用扭曲化的外星C语法,只是作为一个集趣式的记录,为初学C派系语言的读者简单介绍一下那些莫名其妙的代码是如何造出来的。

 C派系语言为我们提供了许许多的奇怪的运算符,最奇怪的运算符之一当数逗号运算符,它本身并没有太多实际意义“运算”,只是计算各个运算项的值,然后将最右边的运算项的值返回。但这一点使得我们有可能将多个表达式合成为一个:

 a = 1;

b++;

c *= 4;

 

合并为:

a = i, b++, c *= i;

呵,好像意义不大,但如果是在循环中使用,就不一样了:

while (i < n)

{

a = i;

b++;

i++;

}

可简写为:

while (a = i++, b++, i < n) ;  /* 注意分号不能少 */

在C++中,由于使用cout等流对象进行的输出语句实际上也是一个表达式,所以对于如下常见的打印整个数组的值的代码:

for (i = 0; i < size; ++i)

     cout << a[i] << endl;

使用逗号运算符并利用好自加运算的特性,可以简写为:

for (i = 0; i < size; cout << a[i++] << endl)  ;  /* 注意分号不能少 */

而对于打印一个二维数组这样的操作,由于循环完一行之后要输出换行,所以外层循环(遍历每一行)不得不使用复合语句:

for (i = 0; i < size; ++i)

{

for (j = 0; j < size; ++j)

    cout << a[i][j];

cout << endl;

}

但如果把cout移到循环内,就可以显著减少行数:

for (i = 0; i < size; cout << endl; ++i)

for (j = 0; j < size; cout << a[i][j++]) ;  /* 注意分号不能少 */

 

当然,也可以是

for (i = 0; cout << endl, i < size; ++i)

for (j = 0; cout << a[i][j], j < size; ++j) ;  /* 注意分号不能少 */

 

但使用逗号运算符时一定要注意其隐含的不确定性,如表达式:

++i, cout << a[i], x + y;

如果语言中对各个表达式的求值顺序不确定,那么cout的子表达式所输出的a[i]就无法确定是自加以前的i还是自加以后的i. 使用逗号运算符,以及相关的重载运算符的连续表达式时应当格外注意这一点。

注:由于时间仓促,本文程序片断未经调试,如有错误,欢迎批评指正。


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网