变量是否可以仅在 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?
是否有一种方法可以声明、分配变量并将其与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
(与主表达式进行比较。
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- 为什么我的程序在for循环中k=0时返回垃圾值
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- C++-For循环未执行
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ 无法在字符数组中使用 for 循环打印字母模式