首页 > 代码库 > [c/c++奇技淫巧]不用循环判断输出5到1

[c/c++奇技淫巧]不用循环判断输出5到1

    偶尔看到的一道题,和哥们几个讨论了一下,这玩意,不是循环就是递归了么,当然,只要达到目的,管他什么循环递归,对吧。现在总结一下我们能想到的所有的方法,大家有新的想法欢迎跟帖讨论~~

    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 esi
  mov esi,0x31
buhaha:
  push esi
  call putchar
  push 0x0a
  call putchar
  add esp,8
  inc esi
  cmp esi,0x36
  jne buhaha
  pop 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++的方法,其他语言肯定也有更“变态”的方法,平时遇到一个问题时可能我们一个人思路有限,但是和大伙交流一下,总能有各种各样的解决方案,所以,不要吝啬你们的解题方法,拿出来大家交流一下吧 :)

[c/c++奇技淫巧]不用循环判断输出5到1