初始化用逗号“,' 分隔的几个变量

Initialize several variables separated by comma ','

提问人:Pierre Nicolas 提问时间:1/8/2018 最后编辑:underscore_dPierre Nicolas 更新时间:1/8/2018 访问量:2264

问:

使用 C++14,如果我想在同一指令上声明和初始化两个整数(使用逗号分隔符):

int i,j = 0;
std::cout << i << "," << j << std::endl;

然后,只有最右边的变量 () 才会被正确初始化。实际上,编译器会输出一条警告消息:j

警告:“i”在此函数中未初始化 [-Wuninitialized]

当然,解决方案是在每个变量上重复它

int i=0, j=0;

但问题是:

有没有办法只用一个赋值运算符正确初始化多个变量?

C++ 初始化 声明 值运算符

评论

4赞 Some programmer dude 1/8/2018
不,没有。
0赞 underscore_d 1/8/2018
在 C++17 中,正如 Caleth 所示。在此之前,您至少可以通过使用 and 等方式避免重复 rhs,但我真的不想鼓励这样做......int i = j = 0
0赞 Luis Colorado 1/9/2018
等号登录不是分配...它是具有初始值设定项值的声明。如何区分不希望初始化的情况和将两个变量初始化为相同值的情况?那应该是什么意思呢?int i=0;int i, j = 0;iint i = 0, j;
0赞 Pierre Nicolas 1/11/2018
为了区分它们,您可以将它们写在两个不同的指令中。但实际上,我的问题更多:如果我想连续创建 26 个变量,并且我懒得一一启动它们(int a=0, b=0, ..., z=0),我有解决方法吗?
0赞 Pushpendra 4/19/2023
我在代码中看到过类似的东西:在这一行之上只定义了 x。对于此行中涉及的其他变量,声明/定义立即发生。我正在寻找这种 C 语法的官方参考。int m = x, y, z;

答:

0赞 Bathsheba 1/8/2018 #1

可悲的是没有;这是语法的一个怪癖。

int i(0), j(0);

是替代项,从 C++98 开始有效。如果你不喜欢重复文字 0,那么你至少可以在这种特殊情况下从 C++11 开始编写

int i{}, j{};

评论

1赞 Carl 1/8/2018
在 C++ 11 中,您还可以使用int i{ 0 }, j{ 0 };
2赞 Caleth 1/8/2018
s/悲伤/快乐。不要鼓励多次声明,否则你最终会得到等等int * i, j = nullptr;
1赞 Bathsheba 1/8/2018
@Carl:比这更好的是,你可以去掉零。
0赞 Pierre Nicolas 1/11/2018
是的!但不好的是,我重复了'{}'而不是'=0';-)
0赞 Bathsheba 1/11/2018
@GenghisCat:是的,但你并没有真正重复文字值。至少在我看来,这满足了 DRY 编程。en.wikipedia.org/wiki/Don%27t_repeat_yourself
-2赞 piwi 1/8/2018 #2

您可以使用一个赋值运算符初始化多个变量,但在声明它们时不能:

int i, j;
std::tie(i, j) = std::make_tuple(0, 0);

评论

2赞 Caleth 1/8/2018
在 C++ 17 及更高版本中,您可以auto [i, j] = std::tuple(0, 0);
0赞 underscore_d 1/8/2018
好吧,如果是“不是在声明时”,那么它就不是“初始化”,是吗?这是一项任务。变量在声明和赋值之间未初始化,这是一种不好的做法,是一种风险,并且对于不可赋值类型来说是不可能的。更基本地说,正如措辞一样,这并不能回答这个问题。
0赞 piwi 1/8/2018
@underscore_d 事实上,这不是初始化,我的错。关于不良做法和风险,这是有争议的,实际上取决于上下文。
1赞 Caleth 1/8/2018 #3

在 C++ 17 及更高版本中,您可以:

auto [i, j] = std::tuple(0, 0);