C语言的switch语句比大家通常所习惯的用法更复杂。switch语句内部可以含有不在case 和 default标号覆盖范围的内容。
假如数组a[]是一张100个元素的素数表。现在要打印出来。如果打印不是从第一个元素开始,则要求显示起始符“…”。用switch语句来写可以写作:
void printab(int a[], int n, int from)
{
switch(from) while(from <n-1) {
from++;
goto next;
default:
printf(“… “);
next:
case 0:
printf(”%d “, a[from]);
}
printf(”\n”);
}
int main()
{
int a[100];
prime(a, 100);
printab(a, 100, 10);
printab(a, 100, 0);
return 0;
}
这个switch语句用法跟大家平常所熟悉的有所不同。但的确是正确的C语言语句。可以正常编译和运行。
用y_tab实现的C语言解释程序完全支持这种用法。因此可以先在解释程序试验,然后平移到C语言编译器。
func prime(a[], all)
{
a[0]=2;
n=1;
for(k=3; ;k+=2) {
for(i=0; i<n; i++) {
if(k%a[i]==0) break;
}
if(i==n) {
a[n++]= k;
if(n>=all) break;
}
}
}
saving prime…used func[0].
func printab(a[], n, from)
{
switch(from) while(from <n-1) {
from++;
goto next;
default:
print “…”, “\b”;
next:
case 0:
print a[from], “\b”;
}
print “”;
}
saving printab…used func[1].
prime(a[],100);
printab(a[], 100, 0);
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103
107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211
223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331
337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449
457 461 463 467 479 487 491 499 503 509 521 523 541
printab(a[], 100, 10);
… 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137
139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241
251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367
373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487
491 499 503 509 521 523 541