23

可能重复:
在 C++ 的条件或控制语句中声明和初始化变量

而不是这个...

int value = get_value();
if ( value > 100 )
{
    // Do something with value.
}

...是否可以将价值范围缩小到仅在需要的地方:

if ( int value = get_value() > 100 )
{
    // Obviously this doesn't work. get_value() > 100 returns true,
    // which is implicitly converted to 1 and assigned to value.
}
4

7 回答 7

22

如果您想要特定的价值范围,您可以引入一个范围块。

#include <iostream>

int get_value() {
    return 101;
}

int main() {
    {
        int value = get_value();
        if(value > 100)
            std::cout << "Hey!";
    } //value out of scope
}
于 2013-01-31T07:59:05.780 回答
13

你能声明一个变量并在if()语句中比较它吗?不可以。
你可以声明一个变量并以范围与if()块紧密绑定的方式进行比较吗?是的!


您可以声明一个变量:

if (int x = 5) {
   // lol!
}

或者你可以用一个来做事

int x = foo();
if (x == 5) {
   // wahey!
}

你不能两者都做!


可以在只需要与 比较的地方作弊true,因为声明本身会计算新对象的值。

所以,如果你有:

int foo()
{
   return 0;
}

然后这个:

if (int x = foo()) {
    // never reached
}

相当于:

{
   int x = foo();
   if (x) {
       // never reached
   }
}

这个最终的语法,使用一个独立的范围块,也是更复杂表达式的金子弹:

{
   int x = foo();
   if (x > bar()) {
       // wahooza!
   }
}
于 2013-01-31T07:55:24.553 回答
6

把它放在一个函数中:

void goodName(int value) {
    if(value > 100) {
        // Do something with value.
    }
}

//...
    goodName(get_value());
于 2013-01-31T08:02:02.143 回答
5

改用怎么样for

for (int value = get_value(); value > 100; value = 0) {
    //...
}

如果你想使用 C++11,你可以使用 lambda:

[](int value = get_value()) {
    if (value > 100) {
        //...
        std::cout << "value:" << value;
    }
}();
于 2013-01-31T07:56:39.180 回答
1

或者您可以为嵌套范围添加一组额外的大括号,尽管它并不完全漂亮:

{
    int value = get_value();
    if ( value > 100 )
    {
        // Do something with value.
    }   
}
//now value is out of scope
于 2013-01-31T08:00:54.690 回答
1

您可以编写一个可以为您进行比较并返回值的小函数,如果比较返回 true,否则返回0以避免执行if块:

int greater_than(int right, int left)
{
   return left > right ? left : 0;
}

然后将其用作:

if ( int value = greater_than(100, get_value()))
{
      //wow!
}

或者你可以for像其他答案所说的那样使用。或者手动放大括号来缩小变量的范围。

无论如何,我不会 生产代码中编写这样的代码。

不要为机器编写代码。为人类编写代码。只要你遵循它们的语法,机器就会理解任何东西;人类了解他们可以阅读的内容。因此,与不必要的范围界定相比,可读性应该是您的优先事项。

于 2013-01-31T08:37:23.850 回答
0

在这种特殊情况下,您可以避开它:

if (int value = (get_value() > 100 ? get_value() : 0)) {
    ...
}

不过,我真的不推荐它。它不适用于您可能想要执行的所有可能的测试,并且它会调用get_value()两次。

于 2013-01-31T08:24:09.640 回答