sfj*_*jac 7 c++ declaration language-lawyer do-while
在你为什么不能声明while循环里面做的一个变量?OP询问为什么do-while循环的while-condition中的声明不在do语句的范围内.这将是非常不自然的,因为C/C++通常遵循"顶级声明"模式.但是相反的是 - 为什么不将do语句中的任何声明的范围扩展到while条件.这样就可以了
int i;
do {
i = get_data();
// whatever you want to do with i;
} while (i != 0);
Run Code Online (Sandbox Code Playgroud)
被缩短为
do {
int i = get_data();
// whatever you want to do with i;
} while (i != 0);
Run Code Online (Sandbox Code Playgroud)
它为限制控制变量的范围提供了一个整洁的语法.(注意:我知道这不是有效的语法 - 这就是问题的关键,为什么不扩展语言以允许这种语法.)
正如我在下面的评论中指出的那样,这个扩展不会破坏现有代码,并且非常符合引入for-init(和while-init)范围的精神.
所以目前作为 do while 存在的循环体是一个块:
do
{ // begin block
int i = get_data();
// whatever you want to do with i;
} //end block
while (i != 0);
Run Code Online (Sandbox Code Playgroud)
那么块作用域是如何工作的,来自3.3.3 块作用域部分:
块 (6.3) 中声明的名称是该块的本地名称;它具有块作用域。它的潜在范围从它的声明点(3.3.2)开始,到它的块的末尾结束。在块作用域声明的变量是局部变量。
显然, 的范围i是块,因此您需要一个规则来创建某种特殊的 do while 块范围。这实际上如何运作?看起来最简单的等效方法是将声明提升到新创建的外部块:
{
int i = get_data(); // hoist declaration outside
do
{ // begin block
// whatever you want to do with i;
} //end block
while (i != 0);
}
Run Code Online (Sandbox Code Playgroud)
如果所有声明都位于主体的开头,则可能会正常工作,但是像这样的场景又如何:
int k = 0 ;
do
{
int i = get_data();
k++ ; // side effect before declaration
int j = k ; // j it set to 1
}
while (i != 0);
Run Code Online (Sandbox Code Playgroud)
吊装后:
int k = 0 ;
{
int i = get_data();
int j = k ; // j is set to 0
do
{
k++ ;
}
while (i != 0);
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是从 do while 开始扩展范围,但这会破坏各种预期的行为。它将破坏名称隐藏在块作用域中的工作方式(来自3.3.10 “名称隐藏”部分):
可以通过在嵌套声明区域或派生类中显式声明同名来隐藏名称 (10.2)。
示例3.3.1显示了这一点:
int j = 24;
int main() {
int i = j, j;
j = 42;
}
Run Code Online (Sandbox Code Playgroud)
in隐藏了全局,但是对于我们特殊的 do jwhile范围如何工作?:mainj
int j = 24;
do {
int i = j, j;
j = 42;
} while( j != 0 )
Run Code Online (Sandbox Code Playgroud)
从 do while 向前扩展内部的范围j肯定会破坏许多现有代码,并且查看前面的示例,没有直观的方法来提升声明。
我们最终可以尝试一下并找到一些可行的东西,但似乎需要做很多工作却收效甚微,而且完全不直观。
| 归档时间: |
|
| 查看次数: |
1042 次 |
| 最近记录: |