2019独角兽企业重金招聘Python工程师标准>>>
偶尔看到的一道题,和哥们几个讨论了一下,这玩意,不是循环就是递归了么,当然,只要达到目的,管他什么循环递归,对吧。现在总结一下我们能想到的所有的方法,大家有新的想法欢迎跟帖讨论~~
ok,开工。
第一条,最简单的,直接输出。(因为输出结果都差不多,就不一个一个截图了)
printf("5 4 3 2 1\n");
第二条,简单的循环。
// for 循环for(int =5; i !=0; i--) {printf("%d\n",i);} // while 循环int i=6;while(--i){printf("%d\n",i);}// do while 循环int i=5;do{prinf("%d\n",i);}while(--i);
三,递归。现在基本循环是讲完了,来讨论一下递归吧,先来个简单点的。
#include <stdio.h>
void print(int i)
{if(i){printf("%d\n",i);print(--i);}
}
int main()
{print(5);return 0;
}
然后另一哥们呵呵一笑,来了个短路递归。
#include <stdio.h>
int print(int n)
{printf("%d\n",n);--n && print(n);
}
int main()
{print(5);return 0;
}
四,c++上场。群里有个用c++的哥们不服了,也来了一段类的构造。
// c++
#include <iostream>
class A{
public :static int n;A(){std::cout<<n--<<std::endl;}
};
int A::n=5;
int main()
{new A[5];return 0;
}
版主说你们这群渣渣,看哥儿给你们耍耍模版。
#include <iostream>
using namespace std;
template <int T>
class F: public F<T+1> {
public:F(){cout << T << " ";}
};
template <>
class F<6> {
};
int main()
{F<1> fu;cout<<endl;return 0;
}
五,递归从新归来。看大家这么热闹,我也想写一个,但是c++又不熟练,突然想起gcc的一个特性,main也可以递归啊
// gcc 通过,vs不行,clang 报两个警告
#include <stdio.h>
#include <stdlib.h>
void main(int i) {printf("%d\n", 6-i);(&main + (&exit - &main)*(i/5))(i+1);
}
六、汇编+开挂。然后一个汇编大牛说话了,你们BB什么,哥儿写的代码你们都看不懂,然后洋气的甩我们一张截图。
// 这个在gcc下编译失败
#include "stdio.h"
int main(){__asm{push esimov esi,0x31
buhaha:push esicall putcharpush 0x0acall putcharadd esp,8inc esicmp esi,0x36jne buhahapop esi}return 0;
}
我们一致讨论说这个算开挂,不能作数,大神不耐烦又补上两行代码
这下大家都没话说了。。。。。
你以为这就完了,当然没有,
我们还没反应过来,大神又说话了,哥儿不用汇编也能开挂,呵呵。
// gcc 下编译成功,运行出现段错误
#include <stdio.h>
typedef void (*hehe)();
int main(){
static char a[]={0x56, 0x57, 0xBF, 0x78, 0x56, 0x34, 0x12, 0xBE, 0x31, 0x00,0x00, 0x00, 0x56, 0xFF, 0xD7, 0x6A, 0x0A, 0xFF, 0xD7, 0x83,0xC4, 0x08, 0x46, 0x83, 0xFE, 0x36, 0x75, 0xF0, 0x5F, 0x5E, 0xC3};*(unsigned long *)(&a[3])=(unsigned long)putchar;((hehe)(&a[0]))();
}
大家都不说话了。。。。。。
总结:说了这么多c/c++的方法,其他语言肯定也有更“变态”的方法,平时遇到一个问题时可能我们一个人思路有限,但是和大伙交流一下,总能有各种各样的解决方案,所以,不要吝啬你们的解题方法,拿出来大家交流一下吧 :)