【问题标题】:Initialize several variables separated by comma ','初始化几个用逗号“,”分隔的变量
【发布时间】:2018-06-17 07:14:32
【问题描述】:

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

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

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

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

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

int i=0, j=0;

但问题是:

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

【问题讨论】:

  • 不,没有。
  • C++17 中有,如 Caleth 所示。在此之前,您至少可以通过使用int i = j = 0 等来避免重复 rhs,但我真的不想鼓励这样做...
  • int i=0; 中的等号不是赋值...它是带有初始化值的声明。您如何区分 int i, j = 0; 的情况,您不希望 i 初始化和两个变量初始化为相同值的情况?那么int i = 0, j; 应该是什么意思呢?
  • 为了区分它们,您可以将它们写在两个不同的指令中。但实际上,我的问题更多:如果我想连续创建 26 个变量并且我懒得一一初始化它们(int a=0,b=0,...,z=0),我做有解决方法吗?

标签: c++ initialization declaration assignment-operator


【解决方案1】:

很遗憾没有;这是语法的一个怪癖。

int i(0), j(0);

是一种替代方法,从 C++98 开始有效。如果您不喜欢重复文字 0,那么至少对于这种特殊情况,您可以从 C++11 开始编写

int i{}, j{};

【讨论】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 而在 C++17 及更高版本中,您可以auto [i, j] = std::tuple(0, 0);
    • 好吧,如果它是“不是在声明时”,那么它不是“初始化”,是吗?这是一个任务。变量在声明和赋值之间未初始化,这是不好的做法,有风险,并且对于不可赋值的类型是不可能的。更基本上,正如措辞所言,这并不能回答问题。
    • @underscore_d 确实,这不是初始化,我的错。关于不良做法和风险,这是有争议的,实际上取决于具体情况。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多