定食屋おろポン

おろしポン酢と青ネギはかけ放題です

Cを勉強してみた。-fizzbuzz編-

Objective-Cを学ぶにはCの知識が不可欠ですよね。
てことで、軽く勉強してみた。
ついでにfizzbuzzでも書いてみた。

シンプル

おそらく普通に読みやすいのがこうだよね

int main(void)
{
	int fizz=3, buzz=5;
	for(i = 1; i<=100; i++)
	{
		if(i%fizz == 0 && i%buzz == 0) {
			printf("fizzbuzz ");
		}
		else if(i%fizz == 0) {
			printf("fizz ");
		}
		else if(i%buzz == 0) {
			printf("buzz ");
		}
		else {
			printf("%d ", i);
		}
	}
	return 0;
}

三項演算子

これだけだとつまらんので、三項演算子で3通りの書き方をして比べてみた。

for(i=1; i<=100; i++)
{
	i%3		? i%5	?printf("%d ", i)
				:printf("buzz ")
			: i%5	?printf("fizz ")
				: printf("fizzbuzz ");
}

for(i=1; i<=100; i++)
{
	i%15		? i%3	? i%5	? printf("%d ", i)
					: printf("buzz ")
				: printf("fizz ")
			: printf("fizzbuzz ");
}

for(i=1; i<=100; i++)
{
	!(i%15)		? printf("fizzbuzz ")
			: !(i%3)	? printf("fizz ")
					: !(i%5)	? printf("buzz ")
							: printf("%d ", i);
}

三項演算子もコレくらいの処理だとむしろ視覚的に分かりやすいように思う。
直感的に理解しやすいのは2つめと3つめかな。
僕にはまだ3つめの書き方のほうが分かりやすいけど、コードを読むのに慣れれば、むしろ2つめの書き方の方がシンプルで分かりやすくなるのかな。

おまけ

おまけで、「より直感的に読みやすいのはこっちか?」と関数を使って書いてみたが、なんだかイマイチ。

int isFizz(int);
int isBuzz(int);
int isFizzbuzz(int);

int main(void)
{
	int i;
	for(i=1; i<=100; i++)
	{
		if (isFizzbuzz(i)) {
			printf("fizzbuzz ");
		}
		else if (isFizz(i)) {
			printf("fizz ");
		}
		else if (isBuzz(i)) {
			printf("buzz ");
		}
		else {
			printf("%d ", i);
		}
	}
	return 0;
}

int isFizz(int i)
{
	return i%3? 0 : 1;
}

int isBuzz(int i)
{
	return i%5? 0 : 1;
}

int isFizzbuzz(int i)
{
	return i%15? 0 : 1;
}

追記

printf("%s", x%y ? "a" : "b");

と言う書き方をすればいいことに気付きましたorz