看看此代码,有人可以解释为什么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;
}
答案 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]