原创  Flexible C++ 收藏

C++是一门非常灵活的语言,只要充分发挥你的想象, 再普通的东西都能玩出新花样

1、1~1000求和
循环?递归?再简单不过的题目了。但是如果不允许你用判断语句呢?
如果你熟悉switch的内部实现,那么你很容易想到使用函数指针数组。

#include <cstdio>

typedef int (*fun)(int);

int f1(int i) {return 0;}
int f2(int i) {fun f[2]={f1,f2}; return i+f[!!i](i-1);}
int main()
{
    printf("%d\n",f2(1000));
}

2、输出1,2,...,100,99,...,2,1
如果同样不让你用判断语句呢?你仍然可以使用函数指针数组:

#include <cstdio>

typedef void (*fun)(int i,int n);

void f1(int i,int n);
void f2(int i,int n);
void f3(int i,int n);

void f1(int i,int n)
{
    fun f[2]={f1,f2};

    printf("%d\n",i);
    f[i+1==n](i+1,n);
}
void f2(int i,int n)
{
    fun f[2]={f2,f3};

    printf("%d\n",i);
    f[i==1](i-1,n);
}
void f3(int i,int n) {}

int main()
{
    f1(1,100);
}

不过我们有更简洁的方法。
短路算法和逗号表达式粉墨登场了,一行搞定~

#include <cstdio>

void f(int i,int n)
{
    printf("%d\n",i),(i<n)&&(f(i+1,n),printf("%d\n",i));
}

int main()
{
    f(1,100);
}

发表于 @ 2007年10月30日 16:00:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:Self Print in C++ | 新一篇:How small can a functional PE executable be?

  • 发表评论
  • 评论内容:
  •  
Copyright © vbvan
Powered by CSDN Blog