[英]Using curly braces to segregate a variable that I want to use multiple times in C++
在下面的代码中,我有一个while语句用于确保输入字符串少于10个字符。 我已经宣布了一个名为cont
的bool
,我用它来告诉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语句的函数中执行了相当多的操作。 每次我都可以使用名为ss
的std::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
的回答中给出的示例。 基本上这样做,任何时候选择不同的变量名称感觉更尴尬。 例如,如果您在代码中编写lock1
, lock2
, lock3
,....
然而,更可接受的做法是将长函数体视为代码气味,并将它们重构为它们自己的函数。 例如
...
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.