gpt4 book ai didi

c++ - C 的替代方案,例如为 C++ 标记和转义嵌套循环

转载 作者:行者123 更新时间:2023-11-30 01:34:40 24 4
gpt4 key购买 nike

在 C 和 javascript 中,我喜欢编写这种东西并让它正常工作的能力。

while (a)
{
ctx: while(b)
{
while (c)
{
if(d) break ctx;
...
}
}
...
}

也许我只是对 C++ 版本感到困惑,但我在 g++ 中遇到了这种错误:

error: expected ‘;’ before ‘ctx’
break ctx;
error: ‘ctx’ was not declared in this scope
warning: label ‘ctx’ defined but not used [-Wunused-label]
ctx:

C++ 似乎拒绝让我编写这段代码。C++ 添加了 lambdas/closures,可能会让我这样做,但我不太确定它们在这种情况下如何工作。

使用 try throw catch 是我能想到的产生这种行为的最接近的构造,但是在不需要的时候使用错误系统的草率让我担心(而且我听说它们很慢)。

我很想将它包装在 extern C 中,除非我在整个项目中完全依赖 C++ 库,所以这也让人感到草率。

是 try block 还是只是重写我唯一的选项?

最佳答案

C 和 C++ 都没有带标签的 break 语句(您可能使用的是语言扩展,而不是标准 C)。

相反,您可以使用 goto 跳出嵌套循环。

while (a)
{
while(b)
{
while (c)
{
if(d)
goto break_b;
}
}
break_b:
// ...
}

I was able to use goto to solve this... I though it was a banned construct in c++?

没有。 goto 在 C++ 中不是“禁止的”。

这是使用 goto 的一种非常好的方式。不存在等效的结构化控制语句。


lambdas/closures [...] potentially would let me do this but I'm not quite sure how they would work in this case.

如果您对 goto 过敏,那么您确实可以使用 lambda,但我认为它不会提供任何额外的可读性:

while (a)
{
[&](){
while(b)
{
while (c)
{
if(d)
return;
}
}
}();
// ...
}

您可以使用命名函数来代替 lambda。但在那种情况下,您需要将任何变量(例如 bcd)作为参数传递(假设它们不是全局变量) .


另一种方法是一个额外的变量:

while (a)
{
bool break_b = false;
while(b)
{
while (c)
{
if(d) {
break_b = true;
break;
}
}
if (break_b)
break;
}
// ...
}

在这三种方法中,我推荐 goto,因为它的可读性最高。除非示例中省略的实际内部循环非常长,在这种情况下,单独的函数可能会更好。

关于c++ - C 的替代方案,例如为 C++ 标记和转义嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55912905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com