我想在C / C ++中使用单个赋值运算符声明两个或多个具有相同值的指针?以下代码是一个示例:
List* a = NULL;
List* b = NULL;
List* c = NULL;
一行中是否有等价物?
编辑:为了澄清,我正在寻找两种语言的答案。我用了一个'斜杠(/)'在愿意回答一种语言的人的情况下分开。谢谢。
答案 0 :(得分:5)
List *a = NULL, *b = NULL, *c = NULL;
或
List *a, *b, *c;
a = b = c = NULL;
请注意,在C ++ 11中,您应该避免NULL
宏支持nullptr
。
答案 1 :(得分:3)
严格地说,你的例子中没有任何作业 - 它们是初始化,因为所有三行都是声明(实际上,大多数情况下都是定义)。
可以将示例包装成一行
List *a = NULL, *b = NULL, *c = NULL;
但请注意,这会重复使用" = NULL"用于初始化每个。另请注意需要额外的星号(*
),因为如果没有这些,并非所有变量都是指针。请注意,在这样的一行中放置多个声明或定义被认为是不好的样式,因为很容易忘记其中一个*
或其中一个初始化者,并获得与预期完全不同的结果(单元化{{1}变量未初始化为零)。
如果您愿意将声明与初始化分开,则可以
auto
如果定义是全局变量,则默认初始化为零,所以
List *a, *b, *c;
a = b = c = NULL;
将所有三个初始化为 // assume at file scope (outside any function)
List *a;
List *b;
List *c;
// equivalently: List *a, *b, *c;
。然而,这对于初始化为其他(非零)值不起作用。在函数(或块)中,通过在NULL
之前进行上述操作,可以实现相同的功能。
在C ++ 11中,可以执行
static
不使用三个命名变量,而是可以使用数组。
List *a{}, *b{}, *c{};
可以简化为
List *a[3] = {NULL, NULL, NULL};
因为在这种情况下缺少的初始化器将导致相应的元素初始化为零。
在C ++ 11及更高版本(仅)中,数组初始化可以 - 如AnT在评论中指出的那样 - 简化为
List *a[3] = {NULL};
或
List *a[3] = {};
在C ++中,通常鼓励(与C不同)将 List *a[3]{};
与NULL
或(来自C ++ 11)的所有用法替换为0
。
答案 2 :(得分:1)
使用c ++ 11,您可以这样做:
int* a{}, *b{}, *c{};
答案 3 :(得分:0)
无法在C中使用单个赋值声明和初始化多个变量。
在C ++ 17中,您可以使用结构化绑定获得所需内容:
auto [a, b, c] = std::make_tuple(ptr, ptr, ptr);
如果您不想重复初始化值,则可以通过重复tuple
次值来创建N
自己的函数:
template <typename T, std::size_t... Is>
auto repeat_impl(T const& x, std::index_sequence<Is...>) {
return std::make_tuple((Is, x)...);
}
template <std::size_t N, typename T>
auto repeat(T const& x) {
return repeat_impl(x, std::make_index_sequence<N>());
}
像这样使用:
auto [a, b, c] = repeat<3>(ptr);
虽然您可以使用array
:
auto [a, b, c] = std::array<List*, 3>();
在C ++ 11中,您可以做的最好的事情是使用tie
将对象与其声明分开初始化:
List *a, *b, *c;
std::tie(a, b, c) = repeat<3>(ptr);