我用C ++编写了一个带有一些goto语句的程序。现在,我需要用Java编写相同的程序。 Java中有没有goto选项?如果是这样,它是如何实现的?它和C ++一样吗?
我的节目是:
#include<stdio.h>
#include<conio.h>
void main()
{
int i,j,k,w,l,q,d;
clrscr();
printf("\nEnter the limit:");
scanf("%d",&k);
for(i = 13; i <= k ; i++)
{
repeat:
j = i%10;
if (j != 0)
{
if(i < 99)
{
for(w = 1; w <= 9; w++)
{
l = 11*w;
if (l == i){
i++;
goto repeat;
}
}
}
if(i > 99)
{
for(q = 1; q<=9 ; q++)
{
d = 111*q;
if (d == i){
i++;
goto repeat;
}
}
}
printf("%d,",i);
}
}
getch();
}
答案 0 :(得分:6)
不,Java在设计上没有goto
运算符。它被认为是有害的。
如果在for循环之前放置continue repeat
标签,则可以使用goto repeat
代替repeat:
重写代码。
E.g。
repeat: for(i=13;i<=k;i++)
然后
continue repeat;
而不是goto repeat
答案 1 :(得分:3)
没有Java在有效状态下没有goto
(但在保留状态下)。你现在不能在你的程序中使用它(它是一个保留的关键字)。
并且避免在C ++中使用它。您可以使用智能放置的continue
和/或break
为这两种语言编写程序。
答案 2 :(得分:1)
简短回答,不。
您也可以参考此question
答案 3 :(得分:1)
尽管goto是Java中的保留字,但它并未在Java语言中使用。但是有一个标签,一个可以与break或continue一起使用的标识符。标签的目的是让迭代跳转到迭代之外,它有点像goto语句。
代码:
labelA:
// some loop {
continue labelA;
}
答案 4 :(得分:1)
我用C ++编写了一个带有一些goto语句的程序。
不,你没有。 C ++要求main()
返回int
,<stdio.h>
是C库(和conio.h
平台特定的 C库)。在C ++中,我们将它拼写为<cstdio>
,我们通常不会使用它(因为<iostream>
功能更强大且类型安全)。但是,您的程序是有效的C.
现在,我需要它在java中编写相同的程序。
天哪,为什么?在某种程度上,我可以弄清楚你的程序实际上打算做什么,它根本没有任何用处。如果这是用于家庭作业,那么你的老师在解释良好的编码风格方面做得非常糟糕。
java中有没有goto选项?
不,goto
未在Java中实现。他们这样做是因为你没有理由使用它。不完全是。事实上它遍布Linux内核并不意味着你有理由。 (这并不意味着他们有真正的理由。)
您的程序可以更简单地编写,例如:
#include<stdio.h>
#include<conio.h>
void main()
{
int i,j,k,w,l,q,d;
clrscr();
printf("\nEnter the limit:");
scanf("%d",&k);
for(i=13;i<=k;i++)
{
j=i%10;
if (j == 0) continue;
if (i<99)
{
for(w=1;w<=9;w++)
{
l=11*w;
if (l==i) continue;
}
}
else
{
for(q=1;q<=9;q++)
{
d=111*q;
if(d==i) continue;
}
}
printf("%d,",i);
}
getch();
}
同样的基本方法也适用于Java。
虽然你真的需要处理其他几个样式问题。请尝试使用实变量名称,并限制变量范围。
答案 5 :(得分:1)
我偶尔会宽恕goto的使用。这不是其中之一。这个特殊问题可以在没有任何goto的情况下解决(break和continue是goto,只是一种限制形式)。
#include <iostream>
int main()
{
unsigned int lim;
std::cout << "Enter the limit: ";
std::cin >> lim;
std::cout << "\n";
if (lim > 999) {
std::cout << lim << " is too large. Truncating to 999.\n";
lim = 999;
}
// Why start at 13? Oh well.
for (unsigned int ii=13; ii <= lim; ii++) {
if (((ii % 10) != 0) &&
((ii < 100) ? (ii % 11) != 0 : (ii % 111 != 0))) {
std::cout << ii << ",";
}
}
std::cout << "\n";
return 0;
}
有时,编写大量代码的最清晰方法是中断或继续。有时,编写大量代码的最清晰方法涉及多级中断或继续。虽然Java确实提供了这样的机制,但C和C ++都没有。
正如我在开始时说的那样,我偶尔会宽恕使用goto。这些场合非常非常罕见:
答案 6 :(得分:0)
你可以用你可以用goto做的标签做任何事情。 Labels as an Anti-Pattern这不是一个好主意。
您在这里尝试做的不需要嵌套循环,这样就完全无需使用标签。
Scanner in = new Scanner(System.in);
System.out.print("\nEnter the limit:");
int limit = in.nextInt();
for (int i = 12; i <= limit; i++) {
if (i % 10 == 0) continue;
if (i <= 99) {
// two digits the same.
if (i % 10 == i / 10 % 10) continue;
} else if (i <= 999) {
// three digits the same.
if (i % 10 == i / 10 % 10 && i % 10 == i / 100) continue;
} else {
System.err.println("Value " + i + " too large to check");
break;
}
System.out.printf("%d,", i);
}