c言語でswitch文が起こりやすいエラー

558 ワード

まず次のコードを見てみましょう

#include 

int main(int argc, char **argv)
{
	int i = 5;

	switch(i)
	{
	case 1: i++; break;
	case 2: i+=2; break;
	case 3: i+=3; break;
	defauit:i+=4;
	}

	printf("%d", i);
	return 0;
}

多くの人が最初に見たときに直接9と言っていると推定されていますが、実際には間違っています.正しい結果は5です.
よく見ると、コードのdefaultが間違っているのに、なぜこんなに明らかなエラーが正常に動作しているのでしょうか.
実際、switchの内部のどの文にもラベルを付けることができ、gotoを通じてそこにジャンプすることができ、コンパイラはdefauitをラベルと見なし、実行結果が私たちが考えているのとは異なり、大きな工事でこのような間違いは発見されにくく、c言語自体が設計したバグだと言われています.しかし「C専門家プログラミング」という本はこの誤りを言語の特性にまとめている.