当我们做一个结构,比如说一棵树或者一个链接列表,这种性质的东西。
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
储存结构节点的队列的类型是什么?我以为是结构的指针。
std::queue<TreeNode*> q;
但如果我尝试这样初始化多个节点。
TreeNode* l = nullptr, r = nullptr;
那是行不通的,你必须要这样做
TreeNode *l = nullptr, TreeNode *r = nullptr;
谁能帮我理解一下?
编辑:看完这个答案 在一行上声明多个对象指针会导致编译器错误。我的理解是。在C和C++语言中,*与声明者绑定,而不是类型指定器。在这两种语言中,声明是基于表达式的类型,而不是对象。
那么队列是如何声明的呢?
在 std::queue<TreeNode*> q;
,括号中包含了一个完整的类型名称。("名称 "指的是整个类型的声明符。) TreeNode *
而不是标识符)。) 当用声明者描述一个类型时,所使用的形式就像一个完整的、带有标识符的正常声明被删除了标识符一样。例如,从一个声明开始 TreeNode *Placeholder
,类型名称为 TreeNode *
.
在 TreeNode* l = nullptr, r = nullptr;
,没有括号来分组。*
与 TreeNode
. 根据C++语法,它与 l
. 如果这里允许使用括号,那么我们就可以写上 <TypeNode *> l = nullptr, r = nullptr;
那就可以了。这里的问题就像你写了 - a + b
: 规则就是这样 -
归于 a
因此,表达式为 -a + b
,不 - (a + b)
.
当然,你可以用 typedef TreeNode *TreeNodeP; TreeNodeP l = nullptr, r = nullptr;
. 这表明这些效果只是C++语法结构方式的结果--编译器没有固有的理由不接受任何类型描述,然后接受用该类型声明的标识符列表,但语法设计根本不支持这一点。
(这样做的一个后果是,写成了 int* a
因为文本中的标记与语法中的标记的近似程度不同。*
更接近于 int
在文中却更接近于 a
语法中,所以间距发出了错误的信息)。)
第二个变量 r
没有声明为指针,应该是。
TreeNode *l = nullptr, *r = nullptr;
TreeNode*
是一个类型,像一个 char
或 int
但如果你在同一行中声明它,你必须使用 *
迭代运算符,这样编译器就知道特定变量是指向对象的指针,而不是对象。当你在一个 deque
或 vector
或类似的东西,你还必须能够判断所接纳的 tpyes 是指向对象的指针还是对象,因此才有了声明 TreeNode*
角括号内。
如果你仔细想想,从语义上讲是有道理的。