void hoge0(int v)
{
//{} がない switch, 分岐が1つだけで使い物にならない
switch(v)
label: break;
//{} がないので label は有効
goto label;
}
void hoge1(int v)
{
//{} がある switch
switch(v){
case 1: break;
label: break;
}
//label: は switch{} のそとでも使える (なんで?)
goto label;
}
int hoge2(int v)
{
switch(v){
case 1: //error, case x:, label: の直後に変数宣言はできない
int i = 0;
break;
label: break;
}
return i;
}
int hoge3(int v)
{
switch(v){
case 1: ; //ダミーの ; をいれれば変数宣言は通る
int i = 0;
break;
label:
i = 2; //i は有効
break;
}
//error, i の有効範囲は switch の {} に制限されている
return i;
}
int hoge4(int v)
{
switch(v){
case 1: { //ダミーの {} をいれれば変数宣言は通るが
int i = 0;
}break;
label:
i = 2; //error, 上の {} の外では i は 無効
break;
}
//error, この i も無効
return i;
}
int hoge5(int v)
{
switch(v){
int i = 0; //ラベルをいれなかったらこの変数宣言は有効
case 1:
i = 2;
break;
label:
i += 3; //この場合, i の宣言だけが有効で代入(i=0)は無効
//case の前か後かは関係ないようだ
//コンパイラが未初期化の値を利用していると警告した
break;
}
if(i < 4){ //error, i の有効期間は {} の中まで
goto label;
}
return i;
}