鱼C论坛

 找回密码
 立即注册
查看: 2316|回复: 5

[已解决]S1E16测试题5.C

[复制链接]
发表于 2018-3-28 08:03:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
goto不能直接执行吧,这里开头的readin:不是由goto语句引进去的,应该不能执行吧。我前两问都做对了,觉得这种标签不能直接运行,必须要通过goto引入。但是小甲鱼老师的答案开头就是引入这个标签。有些不解
最佳答案
2018-4-3 08:57:02
可以看到,只有标签retry没有对应的汇编指令
因为retry被翻译成了一个地址,地址不是指令
S1E16提问.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-28 12:29:42 From FishC Mobile | 显示全部楼层
这就是制造一个循环咯。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-28 14:33:38 | 显示全部楼层
标签并不与某一个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;

}


标签就只是一个地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-4-3 04:03:16 | 显示全部楼层
人造人 发表于 2018-3-28 14:33
标签并不与某一个goto绑定
可以只有标签没有goto
例如

标签在不使用的情况下,应该无视吧。但是我看这里小甲鱼老师的答案开头就是在用标签里的scanf()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-3 08:55:49 | 显示全部楼层
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,[ebp-0D0h]  
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:[edi]  
        long count = 0;
011617AE C7 45 F8 00 00 00 00 mov         dword ptr [count],0  

retry:        printf("%ld\n", count++);
011617B5 8B 45 F8             mov         eax,dword ptr [count]  
011617B8 89 85 30 FF FF FF    mov         dword ptr [ebp-0D0h],eax  
011617BE 8B 4D F8             mov         ecx,dword ptr [count]  
011617C1 83 C1 01             add         ecx,1  
011617C4 89 4D F8             mov         dword ptr [count],ecx  
011617C7 8B 95 30 FF FF FF    mov         edx,dword ptr [ebp-0D0h]  
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语言,也不认识汇编语言,计算机只是在无条件执行指令,直到能源耗尽

暂时先不要深究这些,因为这是你之后的课程,这是你未来要学的汇编语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-3 08:57:02 | 显示全部楼层    本楼为最佳答案   
可以看到,只有标签retry没有对应的汇编指令
因为retry被翻译成了一个地址,地址不是指令
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-1 19:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表