これに異議を唱える人もいますが、これらの状況でgoto
は、「通常の」制御パスの直線性を強調するので、単純な古い方法が非常にクリーンで読みやすい方法だと思います。
int main(int arg, char *argv[])
{
int choice;
choose_shape:
printf("Choose a shape from the following:\n"
" 1.Sphere\n 2.Cone\n 3.Cylinder\n");
scanf("%d", &choice);
if (choice < 1 || choice > 3) {
printf("Invalid selection, please choose again.\n");
goto choose_shape;
}
printf("Enter the radius, r:\n");
...
}
はい、人々は不平を言っているgoto
ので、もう少し正当化させてください。
これは、文字で形状を選択できる、より洗練されたバージョンです。
char c;
shape_t shape;
choose_shape:
printf("Choose a shape: [s]phere, [c]one, c[y]linder:\n");
scanf("%c", &c);
switch (c) {
cases 's':
shape = SHAPE_SPHERE;
break;
case 'c':
shape = SHAPE_CONE;
break;
case 'y':
shape = SHAPE_CYLINDER;
break;
default:
printf("Not a valid shape: %c\n", c);
goto choose_shape;
}
そして、これが 付きのバージョンgoto
です。これにより別の変数 が導入されることに注意してください。この変数の唯一の目的は、ステートメントflag
を取り除くことです。ステートメントのため、ここ (最初はラベルなし) をgoto
単純に使用することはできません。状態が追加されているため、これは読みにくいと思います。5行長くなります。break
goto
switch
char c;
shape_t shape;
int flag;
for (flag = 0; !flag; ) {
printf("Choose a shape: [s]phere, [c]one, c[y]linder:\n");
scanf("%c", &c);
switch (c) {
cases 's':
shape = SHAPE_SPHERE;
flag = 1;
break;
case 'c':
shape = SHAPE_CONE;
flag = 1;
break;
case 'y':
shape = SHAPE_CYLINDER;
flag = 1;
break;
default:
printf("Not a valid shape: %c\n", c);
break;
}
}