if も 3項演算子も for も do whileすらもない ifなしの Fizz Buzz
#include "stdio.h" #include "stdlib.h" int cnumber=0; void fizz(){ printf("fizz"); cnumber++; }; void nonfizz(){ }; void buzz(){ printf("buzz"); cnumber++; }; void nonbuzz(){ }; void number(int i){ printf("%d",i); cnumber = 0; } void nonnumber(int i){ cnumber = 0; } void myexit(void){ printf("\n Hit return key to exit\n"); getchar(); exit(1); } void noexit(void){ } void (*pfizz[3])() = {fizz,nonfizz,nonfizz}; void (*pbuzz[5])() = {buzz,nonbuzz,nonbuzz,nonbuzz,nonbuzz}; void (*pnumber[3])(int) = {number,nonnumber,nonnumber}; void (*pmyexit[2])() = {noexit,myexit}; int main(int argc, char* argv[]) { int loopmax = (111+222+333)*10; int i = 1; head: (*pfizz[i%3])(); (*pbuzz[i%5])(); (*pnumber[cnumber])(i); (*pmyexit[!(loopmax-i)])(); printf(","); i++; goto head; return 0; }
includeが<>を使ってないので必要ならパスは各自で通してねw
ポイントは剰余と関数ポインタで最適化してるところか。 昔、関数ポインタが配列みたいな連続テーブルになって条件分岐を使うより実行動作が速くなることを期待してコードを書いて...
そりゃまぁ、関数コールは、本当にCall命令がコールされれば レジスタのスタックへのPUSHが走るからなメモリコピー関数xレジスタ文はGotoよりも重いよ。(元増田です。)
inline宣言された関数ならマクロみたいにインライン展開される可能性はあるけどね。 でも今時のコンパイラは最適化有効ビルドをすればそんな修飾に関係なく自動でインライン展開かど...