S1E16测试题5.C
goto不能直接执行吧,这里开头的readin:不是由goto语句引进去的,应该不能执行吧。我前两问都做对了,觉得这种标签不能直接运行,必须要通过goto引入。但是小甲鱼老师的答案开头就是引入这个标签。有些不解 这就是制造一个循环咯。。。 标签并不与某一个goto绑定可以只有标签没有goto
例如
# include<stdio.h>
int main(void)
{
label1:
printf("label1\n");
label2:
printf("label2\n");
label3:
printf("label3\n");
return 0;
}
编译器会告诉你说你的标签没有使用,但是并不影响程序正常运行
标签只是一个地址,而goto需要一个地址,然后转到哪个地址去执行
# include<stdio.h>
int main(void)
{
int n;
label1:
printf("label1\n");
label2:
printf("label2\n");
label3:
printf("label3\n");
retry: printf("请输入一个数: ");
scanf("%d", &n);
switch(n)
{
case 1: goto label1;
case 2: goto label2;
case 3: goto label3;
case 4: goto label4;
default:
printf("错误的输入,请重试\n");
goto retry;
}
label4:
return 0;
}
label1
label2
label3
请输入一个数: 1
label1
label2
label3
请输入一个数: 2
label2
label3
请输入一个数: 3
label3
请输入一个数: 7
错误的输入,请重试
请输入一个数: 3
label3
请输入一个数: 2
label2
label3
请输入一个数: 1
label1
label2
label3
请输入一个数: 0
错误的输入,请重试
请输入一个数: 4
请按任意键继续. . .
还可以这样
# include<stdio.h>
int main(void)
{
int n;
label1: label11:
label2: label12:
label3: label13:
retry: label00:
printf("label1\n");
printf("请输入一个数: ");
scanf("%d", &n);
switch(n)
{
case 1: goto label1;
case 2: goto label2;
case 3: goto label3;
default:
printf("错误的输入,请重试\n");
goto retry;
}
return 0;
}
标签就只是一个地址 人造人 发表于 2018-3-28 14:33
标签并不与某一个goto绑定
可以只有标签没有goto
例如
标签在不使用的情况下,应该无视吧。但是我看这里小甲鱼老师的答案开头就是在用标签里的scanf() Checkmate 发表于 2018-4-3 04:03
标签在不使用的情况下,应该无视吧。但是我看这里小甲鱼老师的答案开头就是在用标签里的scanf()
"觉我前两问都做对了,觉得这种标签不能直接运行"
标签不管怎样也不会运行,即使有goto
int main(void)
{
01161790 55 push ebp
01161791 8B EC mov ebp,esp
01161793 81 EC D0 00 00 00 sub esp,0D0h
01161799 53 push ebx
0116179A 56 push esi
0116179B 57 push edi
0116179C 8D BD 30 FF FF FF lea edi,
011617A2 B9 34 00 00 00 mov ecx,34h
# include<stdio.h>
int main(void)
{
011617A7 B8 CC CC CC CC mov eax,0CCCCCCCCh
011617AC F3 AB rep stos dword ptr es:
long count = 0;
011617AE C7 45 F8 00 00 00 00 mov dword ptr ,0
retry: printf("%ld\n", count++);
011617B5 8B 45 F8 mov eax,dword ptr
011617B8 89 85 30 FF FF FF mov dword ptr ,eax
011617BE 8B 4D F8 mov ecx,dword ptr
011617C1 83 C1 01 add ecx,1
011617C4 89 4D F8 mov dword ptr ,ecx
011617C7 8B 95 30 FF FF FF mov edx,dword ptr
011617CD 52 push edx
011617CE 68 30 7B 16 01 push offset string "%ld\n" (01167B30h)
011617D3 E8 5C FB FF FF call _printf (01161334h)
011617D8 83 C4 08 add esp,8
goto retry;
011617DB EB D8 jmp retry (011617B5h)
return 0;
011617DD 33 C0 xor eax,eax
}
标签就是一个地址
在这里 retry这个标签就是011617B5h地址
goto被直接翻译成了jmp
别忘了,计算机并不认识C语言,也不认识汇编语言,计算机只是在无条件执行指令,直到能源耗尽
暂时先不要深究这些,因为这是你之后的课程,这是你未来要学的汇编语言
可以看到,只有标签retry没有对应的汇编指令
因为retry被翻译成了一个地址,地址不是指令
页:
[1]