Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是c+中的goto语句吗+;?_C++_Goto - Fatal编程技术网

C++ 这是c+中的goto语句吗+;?

C++ 这是c+中的goto语句吗+;?,c++,goto,C++,Goto,伪代码: if(testval == 1){ routine_a: result = funcA(); } else { result = funcB(); if(result.failed) goto routine_a; } // process result ... 这是一种好的编程实践吗? 或者有没有比goto语句更好的方法呢?不,这不好。你不应该像这样向后走,这是一个坏习惯,可能会导致你跳过初始化代码等,从而导致未定义的行为。为

伪代码:

if(testval == 1){
    routine_a:
        result = funcA();
} else {
    result = funcB();
    if(result.failed)
        goto routine_a;
}
// process result ...
这是一种好的编程实践吗?

或者有没有比goto语句更好的方法呢?

不,这不好。你不应该像这样向后走,这是一个坏习惯,可能会导致你跳过初始化代码等,从而导致未定义的行为。为什么不只是:

if(testval != 1){
    result = funcB();
}

if (testval == 1 || result.failed) { 
    result = funcA();
}

改变逻辑将允许您:

if(testval != 1){
    result = funcB();
}
if((testval==1)||(result.failed)){
    result = funcA();
}

通过将其分解为一个单独的函数,可以避免重复条件并避免转到。在该单独的功能中:

if (testval != 1) {
    auto result = funcB();
    if (!result.failed)
        return result;
}

return funcA();
if(testval==1 | |(testval=funcB()).failed)testval=funcA()


或者您可以这样做(或者使用一些标志)

这是一个很好的编程实践

取决于你、你的团队(如果你有团队)、你的组织(如果你为团队工作)

在我工作的地方,我们没有在包含大约4000个源文件的代码库中的任何地方使用
goto
。这是一个意见问题,但使用
goto
语句,代码的可读性和可维护性较差

根据您的代码片段,您可以轻松使用:

if(testval == 1){
   result = funcA();
} else {
   result = funcB();
   if(result.failed)
   {
      result = funcA();
   }
}

我个人只想说清楚,你想调用funcA两次(在两个地方,不是调用两次,它只调用一次,而是从两个可能的地方)

因此:



使用GOTO在这里几乎没有什么可获得的,这使得您清楚地知道您真正想要发生的事情——在两个完全不同的条件下调用函数。

任何代码> Goto < /C> >在C++中是不好的。@ iBGG是一个意见,为什么几乎每个GOTO问题都被基于这个站点的意见关闭。“几乎所有的<代码> Goto < /C> >在C++中都不好。在C++中,几乎任何最佳实践语句都是绝对无效的。几乎我使用GOTO的唯一地方就是跳出嵌套循环,即代码向下,永远不向上……如果你必须问<代码> Goto < /C>是正确的解决方案,它可能不是。这是正确的,但很容易出错。因为它要求你在这个条件下完全颠倒逻辑。如果它不仅仅是一个简单的
==
,那么人们可能会把它弄错。@hvd True,但是如果
转到
错误的地方,那就更容易了。阅读代码也可能会出错。然而,整个讨论都是以意见为基础的。为什么不应该做出
结果。失败的
有意义?显然,
result
是一种结构类型。哇,括号太多了
if(testval==1 | | result.failed)
@PeteBecker感谢您分享您的意见。对于初学者和一大群经验未知的程序员(大多数是任何公司的程序员),我更喜欢明确说明操作符的优先级。我知道“用心学习先例是值得的”推理(事实上我也同意),但我已经浪费了太多的时间和金钱来寻找这里的错误引起的错误或调试讨论(甚至/特别是当问题后来被证明在别处时)。@Yunnosch——((编写代码)那是(难以阅读))(因为(期望)它(没有意义))@Yunnosch——我不建议“背诵先例”,尽管你的引号有误导性。所讨论的代码中的表达式是基本的东西。简单成员函数调用周围的括号只是一种干扰。比较表达式周围的括号也是一样。我不能只返回funcA或funcB的结果,请参阅psudeo code
//process result…
的注释,所以ba把你的想法和@Yunnosch的想法一模一样。不要只看代码,也要读前面的句子。你不会在现有的函数中这样做,而是在一个从现有函数调用的新函数中这样做。编程的艺术是把一个问题,然后把它变成其他更小的问题……重复。这个答案就是这个概念的一个很好的例子已应用;具有向上投票权。OPs代码和您的代码都不会调用
funcA()
(或
funcA()
)两次。是的,但调用函数可能会有副作用,因此作为维护工作,我们甚至可以避免编写两次函数,以避免其他开发人员的无意更改。请参阅我的answer@nolan这是关于遵循逻辑流程的。显然,这可能是一个人为的例子,而现实更为复杂,但它仍然是关于清楚地表明w这种情况正在发生。正如我对您的解决方案所作的评论,这并不容易理解。我希望,像大多数人一样,在交换机中,情况是独立的,不会失败。是的,有些情况下失败是正确的做法。也许您是对的,我已经更新了我的答案。感谢您的输入
if(testval == 1){
   result = funcA();
} else {
   result = funcB();
   if(result.failed)
   {
      result = funcA();
   }
}
if(testval == 1){
        result = funcA();
} else {
    result = funcB();
    if(result.failed)
    {
        result = funcA();
    }
}