Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006619
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2012-10-21 14:34:48

今天随便搜了一下,搜到一道面试题。
虽然帖子没说出个所以然来,我认为大意是不使用循环并且只使用一个printf输出一个数组的所有元素。
之前因为某个题看到了关于&&,逗号表达式的一些小把戏。尝试写了下,成功了。
代码如下。
int m(int* input, int i, int size){
      return printf( "%d \n",input[i] ) && ++i &&(i
}
int
main ( int argc, char *argv[] )
{
int input[] = {3,2,4,3,6};
int i = 0;
m(input, i, sizeof(input)/sizeof(int));
return EXIT_SUCCESS;
} /* ----------  end of function main  ---------- */


首先&&这个运算符有很好玩的特性,可以做一些小的trick.
对于&&的左边,如果返回true,那么继续执行右边。如果返回的是false,那么右边就不执行了。
这个题里倒是没有用到,所以可以直接用逗号表达式也是一样的。
逗号表达式则是依次运行每个被逗号分割的表达式,返回最后一个表达式的值。

对于这个函数m,
1.首先判定printf("%d\n",input[i]),这个恒定返回true,所以继续执行。
2.然后执行++i,就是下标后移
3.判定i是不是小于size,如果不是的话,说明数组已经输出完毕,所以给出表达式的值1.
4.如果i小于size,那么说明,没到头,继续输出,执行input(m,i,size)
阅读(3306) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

AnDay_Fly2013-01-07 10:12:10

不能循环貌似只能递归了