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++
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;
}
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;
}
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:
memset
or {0}
the array. 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;
.
Source: Stackoverflow.com