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

原创 2003年12月18日 00:10:00
 

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

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

缩减代码不意味着增加可读性,恰恰相反,过分的缩减代码反而会使代码更难懂,难以维护。本文不提倡滥用扭曲化的外星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. 使用逗号运算符,以及相关的重载运算符的连续表达式时应当格外注意这一点。

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

心理揣摩术

第一章 想看穿他,就得站在他的立场上——心理揣摩术之换位思考篇 揣摩他人的心理,莫过于站在他人的立场上想问题,简单说就是换位思考。换位思考是人对人的一种心理体验过程,将心比心,设身处地,是达成理...
  • sinat_14889231
  • sinat_14889231
  • 2016年03月03日 14:01
  • 477

巧妙利用“盗引”,实现“项目嫁接”之术 赚取超高利润!

“所谓“盗”,此盗非彼盗,此盗又同盗,此盗之为盗,只因道盗道。” 人类自远古时期进化而来,经历了 猿人类、原始人类、智人类、现代类四个阶段。人类在进化这条路走的过程,源于模仿与学习,我称之为“修...
  • muyeseocom
  • muyeseocom
  • 2017年11月20日 09:32
  • 105

【c】c语言中逗号运算符和逗号表达式

 刚开始学习C语言时,对逗号去处符和逗号表达式非常困惑,本文给了我很大的帮助。来自:百度空间-软件工程师  C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如:  3+5,6+8称...
  • great_ghoul
  • great_ghoul
  • 2007年09月10日 20:34
  • 10920

星期几(蓝桥杯)

题目描述:     1949年的国庆节(10月1日)是星期六。      今年(2012)的国庆节是星期一。     那么,从建国到现在,有几次国庆节正好是星期日呢?     只要答案...
  • xinshoushanglu2333
  • xinshoushanglu2333
  • 2016年02月29日 19:35
  • 312

手段-目的理论定性研究实践经验分享

手段-目的理论定性研究实践经验分享 -公司型项目需要尽可能高效率的定性研究,选取方法前必须对时间人力成本做出准确评估。 -需要有分析方案,事先统一标准;初期需要多沟通,确保标准达成一致。 ...
  • sagacity789
  • sagacity789
  • 2012年06月07日 11:13
  • 861

java蓝桥杯:外星日历

/** * 标题:外星日历某星系深处发现了文明遗迹。他们的计数也是用十进制。 他们的文明也有日历。日历只有天数,没有年、月的概念。 有趣的是,他们也使用了类似“星期”的概念, 只不过他们的一个星期...
  • qq_34769573
  • qq_34769573
  • 2017年12月06日 15:04
  • 189

BZOJ 1923: [Sdoi2010]外星千足虫

高斯消元。。。记录一下最大用到哪个就好 有自由元就多组解咯。
  • cgh_Andy
  • cgh_Andy
  • 2017年04月25日 21:14
  • 162

c++逗号运算符

到目前为止,逗号运算符最常见的用途是将两个或更多的表达式放到一个for循环表达式中。逗号运算符的特性有下面几个: 它确保先计算第一个表达式,然后计算第二个表达式; i = 20, j = 2 ...
  • sjpz0124
  • sjpz0124
  • 2015年04月22日 16:37
  • 1861

C语言中逗号运算符怎么用?

逗号运算符( , )是C语言运算符中优先级最低的一种运算符,结合顺序是从左至右,用来顺序求值(最后一个逗号后面表达式的值作为整个表达式的值)。 下面举例说明逗号运算符的使用方法: in...
  • hailongwang2412
  • hailongwang2412
  • 2017年02月27日 14:41
  • 217

bzoj 1923: [Sdoi2010]外星千足虫 (高斯消元)

1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 753  Solved: 474 [Submit][S...
  • clover_hxy
  • clover_hxy
  • 2016年04月23日 10:58
  • 638
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:外星代码生成术之逗号运算符
举报原因:
原因补充:

(最多只允许输入30个字)