do-while声明正文中的声明范围

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)范围的精神.

Sha*_*our 1

所以目前作为 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肯定会破坏许多现有代码,并且查看前面的示例,没有直观的方法来提升声明。

我们最终可以尝试一下并找到一些可行的东西,但似乎需要做很多工作却收效甚微,而且完全不直观。