在C ++中将范围分配给变量

时间:2016-07-02 10:34:19

标签: c++ gcc

看看此代码,有人可以解释为什么a+1;已分配给b吗?

#include <iostream>

int main(int argc, char *argv[])
{
  int a = 5;

  int b = ({
      std::cout << "inside scope" << std::endl;
      a+1;
  });

  std::cout << "b value: " << b;
}

2 个答案:

答案 0 :(得分:7)

构造

int b = ({
    std::cout << "inside scope" << std::endl;
    a+1;
    });

...不是标准C ++,而是g ++编译器提供的语言扩展

它被称为“statement expression”,基本上允许您为计算引入局部变量。

由于你没有使用它,你可以使用这样的标准C ++ “comma expression”

int b = (
    std::cout << "not inside scope" << std::endl,
    a+1
    );

在这两种情况下,序列中的表达式按顺序计算,表达式的值作为整体是上次评估的值。

您绝对需要引入变量的地方,例如一个循环,对于初始化程序中的计算,你可以使用标准的C ++ lambda来实现:

int b = [&](){
    double bah = 3.14;
    std::cout << "inside scope" << std::endl;
    return a+!!bah;
    }();

在C ++ 17及更高版本中,您可以使用std::invoke使这些代码更加清晰,最后不需要JavaScript ()调用,而是预先使用invoke字样

答案 1 :(得分:1)

范围的值是范围内的最后一个语句,因此在这种情况下

b = a + 1 = 5 + 1 = 6

我不建议编写代码,但不是很清楚。

这是一个名为语句表达式的GCC扩展,因此不能使用它是另一个好理由,因为它不可移植。 GCC返回警告:

warning: ISO C++ forbids braced-groups within expressions [-Wpedantic]