变量是否可以仅在 if 语句的作用域中定义,类似于通常为 for 循环所做的那样?

Can a variable be defined only in the scope of an if-statement, similar to how it's often done for for-loops?

本文关键字:for 循环 类似于 定义 是否 if 变量 作用域 语句      更新时间:2023-10-16

是否有一种方法可以声明、分配变量并将其与if构造中的表达式进行比较,使其仅在if构造的范围内定义?

这是有效的(声明和赋值,但条件当然只是函数f的返回值是否等于零(:

int main()
{
  if(int i = f())
  {
    printf("%d", i);
    // i is defined here!
  }
  else
  {
    // Here too!
  }
  // But not here!
}

但当我试图将I的值与实际表达式进行比较时,我遇到了麻烦:

int main()
{
  // Does not compile because "int i = f()" is not a primary expression?
  if((int i = f()) == 3)
  {
    printf("%d", i);
  }
}

从行为的角度来看,创建一个围绕整体的范围是可行的,但在我看来,这看起来很丑陋:

int main()
{
  {
    int i = f();
    if(i == 3)
    {
      printf("%d", i);
      // i is defined here!
    }
    // here too!
  }
  // i is not defined here!
}

我将其与for循环和开关的外观进行比较,在这些循环和开关中,声明和分配变量非常简单,因此它只在有问题的范围中定义。当然,变量的值与那里的任何东西都没有比较,我也不是说它是一样的:

for(int i = 0;;)
{
  break;
}
// i is not defined here
switch(int i = f())
{
  default: break;
}
// i is not defined here!

总之,有没有一种方法可以将变量的定义与"if"的范围联系起来,就像它通常与for和(也许不那么常见(switch的范围联系在一起一样,并且你可以将变量值与表达式进行比较,作为if语句的条件?

据我所知,在if语句的条件下,不可能同时拥有声明和表达式。如果我们查看C++标准部分草案6.4选择语句如果的语法如下:

selection-statement:
    if ( condition ) statement
    if ( condition ) statement else statement
    switch ( condition ) statement
condition:
    expression
    attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
    attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list

因此,您可以使用表达式声明,我看不到任何明显的方法。

您在备选方案中提出的在if语句之前声明i似乎是最好的选择。尽管使用封闭块似乎没有必要:

int i = f();
if(i == 3)

您可以在if中声明变量,但如果您这样做条件取决于类型到的隐式转换bool,这是非常有限的并且有点模糊。这个for中的定义之所以有效,是因为for不是条件的一部分。只需写:

int i = f();
if ( i == 3 ) {
    //  ...
} else {
    //  ...
}

这将变量保留在作用域中,直到封闭结束块,但是封闭块不能大于整个作用如果将其保留在范围内是一个问题,那么函数太大太复杂,需要重构。

您只能在if语句中执行声明布尔逻辑。C++规范在某个地方这么说,但忘了具体在哪里。因此,代码类似于:if (int x = 3 && x == 3) {}永远不会编译,因为它还会抛出错误,即x是在未初始化的情况下使用的

第一个片段之所以有效,是因为您在if的条件表达式中声明和定义i。它将始终评估为true
第二个代码段没有编译,因为您正在将条件表达式中的非主表达式(因为此处声明和定义了i(与主表达式进行比较。