在特定场景中,相当于Java中c++的goto
Equivalent of goto of c++ in Java in a specific scenario
我正在用Java替换一个旧的C++代码:我知道在Java中没有等效的goto,因为它会导致许多令人惊讶的错误和意外的循环终止。
C++代码://我跳过了实际的代码
for(//some condition){
if (excl(grds[i],0))
{
//do something
goto breakout;
}
//some more code
breakout:
//rest of the code
}//end of for loop
Java表示:
for(//some condition){
if (excl(grds[i],0))
{
//do something
}
else
{
//some more code
}
//rest of the code
}//end of for loop
我在其他部分保留了"更多的代码"部分,所以我想它的功能与突破相同。当if条件为true时,它不会转到其他部分,其余代码将照常执行。我想break或continue不会达到目的,因为我们需要以任何方式为所有迭代运行代码部分的其余部分。
这是用Java表示C++代码的正确方式吗?
是的,那样会更好—在Java和C++中。
这可能是最简单的方法:
for(//some condition){
if(!excl(grds[i],0))
{
//some more code
}
//rest of the code
}//end of for loop
您真的不应该在C++中使用goto
。附带说明一下,在Java中,可以使用命名块来模拟goto
:
namedBlock:
{
// some code
if(condition)
break namedBlock;
// some more code
}
// rest of the code
但这是一种糟糕的做法。别这么做。忘了我曾经提到过;(
for(//some condition){
if (!(excl(grds[i],0)))
{
//some more code
}
//rest of the code
}//end of for loop
编辑:在你澄清之后,你做这件事的方式很好。
你为什么不能这样?
在C++代码中,//some more code
仅在条件为false时执行,而//rest
始终执行。所以把它放在if.
是。
更准确地说,这也是用C++表示代码的最佳方式。为什么要使用goto
而不是简单的if
?
这是一个破解
for(//some condition){
do { // note this *do*
if (excl(grds[i],0))
{
break; // out of do/while
}
//some more code
}
while(false); // do only once
//rest of the code
}//end of for loop
我相信人们会因此讨厌我,但与if/else示例相比,您可以更接近Java中的goto
语句。例如,你可以做:
for(/*some condition*/){
breakout: {
if (excl(grds[i],0)) {
break breakout; //this will jump to the end of the "breakout" block
}
//some more code
}
//rest of the code
}
当然,这并不是一个好的Java编码风格的例子,仅仅因为可以做到这一点并不意味着应该做到。真的你应该坚持if/else。
在某些情况下,非常罕见的情况下,在C++中使用goto
正是正确的选择。所示的示例不是其中之一。这是一个永远不应该使用的goto
,句号。如果可以在不增加变量、不增加复杂性的情况下消除goto
,那么goto
就没有存在的理由。
goto
在C++中的一些有效使用在Java中可以很容易地消除。
- C和C++没有中断或继续嵌套循环的方法。Java的确如此。当
goto
的目标正好在某个右大括号之前时,将goto label
更改为continue label
。当goto
的目标在某个右大括号后立即时,将goto label
更改为break label
。(标签语句可能需要四处移动。( - 一些C++代码使用
goto
代替throw
进行本地错误处理/本地错误恢复。C++异常会带来相当严重的性能损失。如果代码正在转换为Java,那么性能显然不是问题。对这种goto
使用Java异常
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 加密在 Windows、C++ 和 Java 中传输中的数据
- Java从C++回调到C++回调
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 用C++包装 Java 库 (JNI)
- 使用 TreeSet Java 对反转进行计数
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- 如何从保存在 Java 中C++的字节数组中读取数字?