[c++] How can I declare and define multiple variables in one line using C++?

I always though that if I declare these three variables that they will all have the value 0

int column, row, index = 0;

But I find that only index equals zero & the others are junk like 844553 & 2423445.

How can I initialise all these variables to zero without declaring each variable on a new line?

This question is related to c++

The answer is


template <typename ...A>
constexpr auto assign(A& ...a) noexcept
{
  return [&](auto&& ...v) noexcept(noexcept(
    ((a = std::forward<decltype(v)>(v)), ...)))
    {
      ((a = std::forward<decltype(v)>(v)), ...);
    };
}

int column, row, index;

assign(column, row, index)(0, 0, 0);

When you declare a variable without initializing it, a random number from memory is selected and the variable is initialized to that value.


As of C++17, you can use Structured Bindings:

#include <iostream>
#include <tuple>

int main () 
{
    auto [hello, world] = std::make_tuple("Hello ", "world!");
    std::cout << hello << world << std::endl;
    return 0;
}

Demo


int column = 0, row = 0, index = 0;

As others have mentioned, from C++17 onwards you can make use of structured bindings for multiple variable assignments.

Combining this with std::array and template argument deduction we can write a function that assigns a value to an arbitrary number of variables without repeating the type or value.

#include <iostream>
#include <array>

template <int N, typename T> auto assign(T value)
{
    std::array<T, N> out;
    out.fill(value);
    return out;
}

int main()
{
    auto [a, b, c] = assign<3>(1);

    for (const auto& v : {a, b, c})
    {
        std::cout << v << std::endl;
    }

    return 0;
}

Demo


int column(0), row(0), index(0);

Note that this form will work with custom types too, especially when their constructors take more than one argument.


I wouldn't recommend this, but if you're really into it being one line and only writing 0 once, you can also do this:

int row, column, index = row = column = 0;

Possible approaches:

  • Initialize all local variables with zero.
  • Have an array, memset or {0} the array.
  • Make it global or static.
  • Put them in struct, and memset or have a constructor that would initialize them to zero.

As @Josh said, the correct answer is:

int column = 0,
    row = 0,
    index = 0;

You'll need to watch out for the same thing with pointers. This:

int* a, b, c;

Is equivalent to:

int *a;
int b;
int c;

When you declare:

int column, row, index = 0;

Only index is set to zero.

However you can do the following:

int column, row, index;
column = index = row = 0;

But personally I prefer the following which has been pointed out.
It's a more readable form in my view.

int column = 0, row = 0, index = 0;

or

int column = 0;
int row = 0;
int index = 0;

If you declare one variable/object per line not only does it solve this problem, but it makes the code clearer and prevents silly mistakes when declaring pointers.

To directly answer your question though, you have to initialize each variable to 0 explicitly. int a = 0, b = 0, c = 0;.