操作符不简单(基础很重要)

逛论坛时看到这么样个题目,说是EMC的笔试题。

函数原形已经给出:int func(int i, int N);
功能:调用该函数,打印如下格式的输出,例func(1, 5);
1
2
3

5
4
3
2
1
即每行一个数字。(注意:N只打印一次)
要求:  只使用一条语句
不准使用如下的关键字:typedef, enum, do, while, for, switch, case, break, continue, goto, until, if,  不能使用逗号表达式和?:表达式。

------------------------------------------------------------------------------------------------- 
感觉有意思,但却不知道如何解,感觉无从下手。于是想在网上看看高手们是如何解答的。
发现了如下解答
return printf("%d/n",i) + ( (N-i)!=0 && (func(i+1,N)+printf("%d/n",i)));
拿到机子上一试,输出与要求的不符。但这给我指出了一条思路。
经过思考,调试。我的解答如下。
return (n>i&&printf("%d/n",i)&&func(i+1,n))||(n==i&&n>0&&printf("%d/n",n)&&func(n-1,n-1));

在解题的过程中,不停地翻看c++ primer的操作符表,这才发现,一直以来,我都是觉得这是很简单,常常是熟视无睹的知识,原来不少我都没掌握好,甚至有些操作符自己还不知道。
比如 1+2>5 的结过应该是false  //这应该是典型的语言考试题,但在实际开发中很容易当成 "1+(2>5)"。
再比如 printf("this is one/n")+(1+printf("this is two/n"));
输出如下

this is one
this is two
但printf("this is one/n")+(1 && printf("this is two/n")的输出却是。
this is two
this is one
你知道这是为什么吗?
因为(1&&printf("this is two/n")最外层"()"是个类型转换符(此处将bool 转为int),它的优先级大于加号。

程序很小,却很好地考查了对C++操作符的掌握能力
一个语句完这么多功能,很强。当然,这只适用于考试。在实际开发中,这样的程序是不容许的,很难读懂。

我是新手,不知道上面的观点是否有不对的地方,如果有,恳请你告诉我,不胜感激。
在写博客时又在网上搜了一下,发现好多更精练的解答,大家可以搜搜。

你可能感兴趣的:(c,语言,EMC)