65日目 FizzBuzzと文字列ポインタ

いまさらFizzBuzzなど - hogelogの日記 - ハチロク世代


ずいぶん昔に*1id:hogelogにif分岐無しでFizzBuzz教えてもらったのだが、その時はなぜそう書けるのかわかってなかった。

じゃんけんゲームを改変したときのashitanoのアドバイスを思い出したので、ようやく文字列ポインタを理解することにした。

まずね、!2が0になることにおどろいた。

#include <stdio.h>

int main()
{
	printf("!2: %d", !1);
	return 0;
}

これがフラグってやつか、とはじめて気付いた。いや、まだ違うかもだけど。

#include <stdio.h>
#define NUM 10

int main()
{
	int i;

	for(i = 1; i < NUM+1; i++)						
		printf("%2d: %d\n", i, !(i%3));		//3で割れるフラグ
	return 0;
}

フラグは0,1だけじゃなくてもいい。(4進なら4通りの分岐が表せる)

#include <stdio.h>
#define NUM 20

int main()
{
	int i;

	for(i = 1; i < NUM+1; i++)						
		printf("%2d: %d\n", i, !(i%3)+!(i%5)*2);	// 0,1,2,3の場合分け(3 = 1 + 2)

	return 0;
}

そしたら数字とFizz, Buzz, FizzBuzzに当てはめるだけじゃん…

と思ったがprintfでの数字表示がちょっと面倒だった。とりあえず0を表示。

#include <stdio.h>
#define NUM 20

int main()
{
	int i;
	char *str[]={"0", "Fizz", "Buzz", "FizzBuzz"};	//「文字列の配列を表すポインタ」

	for(i = 1; i < NUM+1; i++)
		printf("%2d: %s\n", i, str[!(i%3)+!(i%5)*2]);

	return 0;
}

たどりついたのはこんなところ。ほとんどコピぺですが。

#include <stdio.h>
#define NUM 20

int main()
{
	int i;
	char *str[]={"%d\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"};

	for(i = 1; i < NUM+1; i++)
		printf(str[!(i%3)+!(i%5)*2], i);
	//何番目かが表示できなくなって悲しい ってか""いらんのかprintf

return 0;
}

文字列配列の中に%d入れても、printfで読み込んでくれるってのが裏技的だな。
もちょっと追記する。

*1:約二ヶ月前だった