繁体   English   中英

使用花括号来隔离我想在C ++中多次使用的变量

[英]Using curly braces to segregate a variable that I want to use multiple times in C++

在下面的代码中,我有一个while语句用于确保输入字符串少于10个字符。 我已经宣布了一个名为contbool ,我用它来告诉while循环在我的条件满足后停止。

#include "stdafx.h"
#include <iostream>
#include <string>

int main()
{
    using namespace std;

    cout << "Enter a string less than 10 characters long: ";

    string teststring;

    {
        bool cont(false);

        //if input is 10 or more characters, ask for input again until it is less
        while (!cont)
        {
            getline(cin, teststring);

            if (teststring.length() >= 10)
            {
                cout << "Too long, try again: ";
            }
            else
            {
                cout << "Thank you.\n\n";
                cont = true;
            }

        }
    }

    return 0;
}

正如你在那里看到的那样,我使用了一组{}来分隔代码,给cont变量赋予这些大括号内的局部范围。 我做了这个,所以如果我想再次使用那个变量名,我可以重新声明它,当我完成它,它就被破坏了。

这是可接受的做法吗? 或者有更好的方法来做我做过的事情吗? 我承认在这个特定的基本场景中,条件很简单,几乎没有必要,但我可能希望将来为更复杂的循环做这件事。

一般来说? 是。 这很好。

在这个特定情况下? 不,不用了。 没有再使用那个名字,在这个简单的代码中你不会这样做。 所以这只是噪音。

看......这是一个平衡点。

我发现自己在执行多个相关SQL语句的函数中执行了相当多的操作。 每次我都可以使用名为ssstd::stringstream构建它。 当然,我可以给每个人一个不同的名称,但它完全可以防止错误将每个语句构建器保留在自己的范围内。

当你使用锁定防护等东西时,它也是一种非常常见的技术。

这是一种可接受的做法,完全按照你的说法行事。 但是很少使用它,因为在小函数中,它是明确的,因此可以在函数顶级范围中使用cont变量。 如果您觉得需要在较大的函数中分隔范围,则通常首选创建具有显式名称的另一个函数。

您可以将这些大括号视为仅调用一次的无名函数。 如果你发现自己经常使用它,也许你应该给它一个自己的名字。

另一个选择是重写循环以不需要cont变量,例如:

string teststring;
do
{
    cout << "Enter a string less than 10 characters long: ";
    getline(cin, teststring);
} while (teststring.length() >= 10);

cout << "Thank you.\n\n";

但这并不总是可行的,特别是如果您需要根据停止条件输出不同的消息。

是的,如果您有充分的理由重新使用变量,那很好。 锁定保护是我自己的代码中最常见的用法,以及Lightness对std::stringstream ss的回答中给出的示例。 基本上这样做,任何时候选择不同的变量名称感觉更尴尬。 例如,如果您在代码中编写lock1lock2lock3 ,....

然而,更可接受的做法是将长函数体视为代码气味,并将它们重构为它们自己的函数。 例如

...
string teststring;

{
    bool cont(false);
    //10 lines of code to handle the foo scenario
}
{
    bool cont(false);
    //15 lines of code to handle the bar scenario
}
...

通过重构看起来更好地处理:

...
string teststring;
foo(teststring);
bar(teststring);
...

void foo(string &teststring){
bool cont(false);
//10 lines of code
}

void bar(string &teststring){
bool cont(false);
//15 lines of code
}

这显然是一个玩具箱,但这是一个很好的做法,为此目的有“独立”块。 我碰巧相信它们是构建长函数的更好方法,而不是将其分解为(在许多情况下)没有单独目的的成员。

在这种情况下,您可以提供更快,更清晰,更安全的程序,尤其是在引入每个块的注释(可能是一行)时。

但是在这种情况下,您可以考虑:

    for ( bool cont(false);!cont;)

这具有相同的效果。 for(.;.;.)语句中声明的变量仅限于该语句的范围。

在这种情况下,您可以使用以下方法躲避整个变量:

    for(;;) //<--- Canonical formulation for 'infinite' loop.
    {
        getline(cin, teststring);

        if (teststring.length() >= 10)
        {
            cout << "Too long, try again: ";
        }
        else
        {
            cout << "Thank you.\n\n";
            break; //<--- Escapes the loop.
        }

    }

脚注(回应评论):

你应该把一个for环路上的“语法糖” while循环。 这在他们的表现等方面没有什么不同,只选择最好的一个。 for(;cond;)看起来很有趣。

可能会有很小的(微小的)性能优势可以break但我碰巧认为它在许多情况下实际上更简单,更易读。

如果代码更复杂,可能会有更多的“循环结束”代码,因此它变为:

for(bool cont(false);!cont;) {

    //Complex code with multiple 'exit' conditions...

    if(!cont) {
        //Go round again code that won't fit nicely in last term of for loop...
    }
}

而使用break只是让“快速退出”更容易理解。 他们没有(被广泛地)认为具有goto的“恶业”,因为他们“进入”一个非常明确的执行点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM