提问人:Pierre Nicolas 提问时间:1/8/2018 最后编辑:underscore_dPierre Nicolas 更新时间:1/8/2018 访问量:2264
初始化用逗号“,' 分隔的几个变量
Initialize several variables separated by comma ','
问:
使用 C++14,如果我想在同一指令上声明和初始化两个整数(使用逗号分隔符):
int i,j = 0;
std::cout << i << "," << j << std::endl;
然后,只有最右边的变量 () 才会被正确初始化。实际上,编译器会输出一条警告消息:j
警告:“i”在此函数中未初始化 [-Wuninitialized]
当然,解决方案是在每个变量上重复它
int i=0, j=0;
但问题是:
有没有办法只用一个赋值运算符正确初始化多个变量?
答:
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);
评论
int i = j = 0
int i=0;
int i, j = 0;
i
int i = 0, j;
int m = x, y, z;