所以我参加了计算机科学入门课,我不懂任何C编程语言,也没有任何教授。然而,我们被告知只使用两个控制结构将一些表达式重写为C:
goto label ;
if (expression) goto label ;
第一个就是:
if (i > 5)
{
i++ ;
}
if (sum > 5)
{
sum++ ;
}
我甚至不知道为什么要改变。第二个是:
sum = 0 ;
for (i=0; i<100; ++i)
{
if (V[i] > 0)
{
sum = sum + V[i] ;
}
}
我写的:
sum = 0;
i = 0;
label:
if (V[i] > 0)
sum = sum + V[i];
if (V[i] < 0)
sum = sum;
if( i < 100)
++i;
goto label;
我的问题是: 我制作的代码有意义吗?关于我唯一理解的是goto将代码带到它所说的任何地方。我知道一点Java,但就是这样。我不仅仅是在寻找某人为我做我的工作,但我向老师寻求帮助,他只回答了我关于作业错字的问题。我想我应该知道goto表达式的作用,以及C代码的行是如何工作的,但我一直在看大量关于为什么你不应该使用goto语句的帖子,没有一个谈论如何实际使用一个。这是我在这里发表的第一篇文章,请原谅我,如果这篇文章过于具体,或者过于含糊不清。 编辑:他还说我们不会在新代码中使用{}。
答案 0 :(得分:2)
for循环可以被认为具有以下基本形式:
for (init; cond; inc)
statement-block
上面的for循环基本上等同于以下使用while
:
init;
while (cond) {
statement-block
inc;
}
另一方面,while循环可以被认为具有以下基本形式:
while (cond)
statement-block
使用label:
和if (cond) goto label;
loop_beg:
if (!cond) goto loop_end;
statement-block
goto loop_beg;
loop_end:
如果您同时使用这两种转换,那么您应该能够使用for
或while
重写C中的任何代码,仅使用goto
执行相同的操作。< / p>
答案 1 :(得分:1)
考虑第一个例子的第一部分:
if (i > 5)
{
i++ ;
}
如果i <= 5,控制流程在哪里?如果i>,控制流程在哪里? 5? - 在阅读之前,你应该确保你可以回答这个问题。
直接翻译
if (i > 5) goto if-body;
goto end-if
if-body:
i++;
end-if:
....
您应该说服自己,上面的控制流程与原始控制流程相同。您可以通过翻转条件来简化这一点:
if(i <= 5) goto end-if;
i++;
end-if:
....
同样,你应该说服自己控制流程仍然是相同的。
从这一点以及Brandin在答案中给出的内容,您应该能够完成其余任务。
答案 2 :(得分:0)
goto
实际上非常容易使用和理解,你写了一个标签,标记了一段代码,你想要回到(或跳到前面)标签可以在{{之前1}}以及它之后,没关系,为什么要不惜一切代价避免它会使代码很难维护而且所有纠结(就像意大利面!)如果这有任何意义的话
并且关于您的最后一段代码,您应该将goto
与条件绑定,否则代码将在goto
和label
之间来回反复
答案 3 :(得分:0)
这是我最终得到的,跟随thurizas和brandin的所作所为:
if (i > 5) goto ibody;
goto ifsum;
ibody: i++;
ifsum: if(sum > 5) goto sumbody;
goto end;
sumbody: sum++;
end;
和
sum = 0;
i = 0;
label1: if (V[i] > 0) goto sum1;
if (V[i] < 0) goto sum2;
sum2: sum = sum;
goto labeli;
sum1: sum = sum + V[i];
labeli: ++i;
if(i >= 100) goto end;
if(i < 100) goto label1;
end;