【转自http://rednaxelafx.iteye.com/blog/132053】
求下面程序的输出:
#include <stdio.h>
#include <malloc.h>void foo(char* a, char* b, int len) {
switch (len & 0x7) {
default: {
while (len > 7) {
len -= 8; *a++ = *b++;
}
case 7: *a++ = *b++;
case 6: *a++ = *b++;
case 5: *a++ = *b++;
case 4: *a++ = *b++;
case 3: *a++ = *b++;
case 2: *a++ = *b++;
case 1: *a++ = *b++;
}
}
}
void main(void) {
int i;
int len = 26;
char* a = (char*)malloc(100);
char* b = "abcdefghijklmnopqrstuvwxyz\0";
for (i = 0; i < 100; i++) {
a[i] = '\0';
}
foo(a, b, len); /* a = "ab\0"; */
printf("%s\n%s", a, b);
}
这题的意义是,C/C++的switch statement中,case/default标签无论出现在哪里都没关系,都能按照switch语义根据条件跳转到对应标签后执行.简单点说,在这题里的default后的那对大括号加不加是等价的,所以那个while循环不会被执行。switch语句进入case 2,没有break,又继续执行case1,最终输出ab。
Java中的switch statement不允许跨case的block,因此上面的default后的大括号就是非法的了。