如何使用C++在一行中声明和定义多个变量?

Sam*_*Sam 152 c++

我总是认为,如果我声明这三个变量,它们都将具有值0

int column, row, index = 0;
Run Code Online (Sandbox Code Playgroud)

但我发现只有索引等于零而其他的都是垃圾,如844553和2423445.

如何在不声明新行的每个变量的情况下将所有这些变量初始化为零?

Jos*_*osh 188

int column = 0, row = 0, index = 0;
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 145

当你声明:

int column, row, index = 0;
Run Code Online (Sandbox Code Playgroud)

只有索引设置为零.

但是,您可以执行以下操作:

int column, row, index;
column = index = row = 0;
Run Code Online (Sandbox Code Playgroud)

但我个人更喜欢以下指出的内容.
在我看来,这是一种更易读的形式.

int column = 0, row = 0, index = 0;
Run Code Online (Sandbox Code Playgroud)

要么

int column = 0;
int row = 0;
int index = 0;
Run Code Online (Sandbox Code Playgroud)

  • 在最后两个之间,我根据这两个值是否必须真的是相同的类型(`bool previousInputValue,presentInputValue;`)或者它们恰好是现在相同的类型而不是真的需要(`uint8_t height)来决定,宽度;`可能会变成'uint8_t高度; uint16_t宽度;`在未来,应该是`uint8_t高度; uint8_t宽度;`到开头). (3认同)
  • 最后一种形式无疑是最明确地说明每个变量的类型并清楚地表明每个变量都已初始化。也就是说,并不清楚列和行是否应该是相同的类型。也许我们都更喜欢 `int presentValue = 0; 的明确性。typeof(presentValue) previousValue = presentValue;`,但我相信`typeof()`是一个非标准的GCC扩展。 (2认同)

Mat*_*haq 43

正如@Josh所说,正确的答案是:

int column = 0,
    row = 0,
    index = 0;
Run Code Online (Sandbox Code Playgroud)

你需要用指针注意同样的事情.这个:

int* a, b, c;
Run Code Online (Sandbox Code Playgroud)

相当于:

int *a;
int b;
int c;
Run Code Online (Sandbox Code Playgroud)

  • 我讨厌那个指针的东西,这没有任何意义.星号是该类型的一部分,因此它应该适用于所有类型.想象一下,如果`unsigned long x,y;`声明`x`为`unsigned long`但是`y`只是`unsigned`,又叫`unsigned int`!那是完全一样的!</咆哮> (27认同)
  • 作为一个方面没有,实际上它是有道理的*不一定是类型的一部分,因为``int*a``意味着``*a``代表一个``int``值. (10认同)
  • 这说得通."int*a,b,c;" (5认同)
  • @JeroenBollen好吧,如果你在变量名旁边写一个指针星号而不是类型,这是有道理的,但这本身没有任何意义.就像我上面说的那样,星号是类型的一部分,而不是名称的一部分,所以它应该与类型分组! (5认同)
  • 这一点已经完成,但只是为了增加它的空缺本质上是缺少一个类型,但你仍然可以指向它.因此,为什么`void*a`将编译而`void*a,b,c`将不会.这种合理化对我有用. (2认同)
  • 我认为应该指出的是,对于参考文献(&amp;)也是如此。另外,如果你希望它们都是指针,那么你可以写“int *a, *b;”。我相信它仍然是 C++ 的一部分,只是因为向后兼容性。 (2认同)
  • int* a,b,c; 得到不同的结果。typedef int* INT_PTR; INT_PTR a、b、c;我会认为“*”是类型的一部分。 (2认同)
  • 实际问题是,声明中不允许使用括号。如果可以写“(int*) a, b, c;”,那么就可以声明三个指针而无需重复“*”。当然,这个问题是从 C 的旧时代继承到 C++ 中的,当时(源代码)字节很昂贵,程序员编写了诸如“char c, arr[255], *s;”之类的东西。 (2认同)

Mar*_*k B 23

如果你为每行声明一个变量/对象,它不仅可以解决这个问题,而且可以使代码更清晰,并在声明指针时防止出现愚蠢的错误.

要直接回答您的问题,您必须明确地将每个变量初始化为0.int a = 0, b = 0, c = 0;.


Mic*_*fik 15

int column(0), row(0), index(0);
Run Code Online (Sandbox Code Playgroud)

请注意,此表单也适用于自定义类型,尤其是当它们的构造函数使用多个参数时.

  • 现在使用统一初始化(等待 C++17 为 `auto` 修复此问题...): int column **{** 0 **}** , row **{** 0 **}** , index **{** 0 **}** ; (2认同)

iva*_*ult 9

从 C++17 开始,您可以使用结构化绑定

#include <iostream>
#include <tuple>

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

Demo


Lev*_*ike 6

我不会推荐这个,但如果你真的很喜欢一行并且只写 0 一次,你也可以这样做:

int row, column, index = row = column = 0;
Run Code Online (Sandbox Code Playgroud)


Aja*_*jay 5

可能的方法:

  • 将所有局部变量初始化为零。
  • 有一个数组,memset或者{0}数组。
  • 使其全局或静态。
  • 将它们放入struct, 和/memset或有一个构造函数将它们初始化为零。


j b*_*j b 5

正如其他人提到的,从 C++17 开始,您可以使用结构化绑定进行多个变量赋值。

将此与模板参数推导相结合,std::array我们可以编写一个函数,将值分配给任意数量的变量,而无需重复类型或值

#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;
}
Run Code Online (Sandbox Code Playgroud)

Demo