【问题标题】:Initialization of multiple references Java多个引用Java的初始化
【发布时间】:2021-07-30 13:12:59
【问题描述】:

我的链表类如下:

class ListNode {
 public int val;
 public ListNode next;
 ListNode(int x) {
     val = x;
     next = null;
 }
}

现在在一个有签名的方法中

public ListNode getIntersectionNode(ListNode h1, ListNode h2)

我有这样的声明:

ListNode t1=h1,t2=h2;

这会产生一个编译器错误,这让我很困惑,因为在 C++ 中,我可以简单地这样做:

ListNode *t1=h1,*t2=h2;

(对于 C++ 之一,该方法将接受 ListNode *h1 and ListNode* h2)。 谁能解释为什么我不能在同一个语句中初始化多个引用?

更新最小可重现示例:

public ListNode getIntersectionNode(ListNode h1, ListNode h2) {
    if (h1 == null || h2 == null)
        return null;
    int len1 = 0, len2 = 0;
    ListNode t1 = h1, t2 = h2;
    while (t1 != null) {
        len1++;
        t1 = t1.next;
    }
    while (t2 != null) {
        len2++;
        t2 = t2.next;
    }
    int diff;
    diff = (len1 > len2) ? len2 - len1 : len1 - len2;
    t1 = h1, t2 = h2;
    if (len1 > len2)
        while (diff--> 0) t1 = t1.next;
    else
        while (diff--> 0) t2 = t2.next;
    ListNode ans = (len1 > len2) ? t1 : t2;
    return ans;
}

这是完整的方法。编译器错误是:

./Solution.java:22: error: ';' expected
        t1=h1,t2=h2;

【问题讨论】:

  • 请显示编译器错误,给我们minimal reproducible example。您在此处显示的内容应该(/可能)没问题。
  • @AndyTurner 我已经更新了
  • 错误在diff=(len1>len2)?len2-len1:len1-len2;下一行,将t1=h1,t2=h2;替换为t1=h1; t2=h2;

标签: java pointers pass-by-reference


【解决方案1】:

编译器错误不在这一行:

ListNode t1=h1,t2=h2;

就在这一行:

t1=h1,t2=h2;

您可以在单个声明中声明多个变量,但不能在单个语句中执行多个赋值 (*)。就像它说的:你需要一个;

t1=h1; t2=h2;

(*) 好的,你可以在一个语句中做多个赋值。例如:

for (;; t1 = h1, t2 = h2) { ... }

这是允许的,因为 ForUpdateStatementExpressions 的列表(分配是 SE)。

也可以t1 = t2 = h1;,先将h1的值赋值给t2,再将t2的值赋值给t1

更准确地说,我应该说的是,您不能在用逗号分隔的单个语句中使用多个语句表达式(基本 for 语句中的 ForInit 除外)。您必须使用的分隔符是;,将其分成两个语句。

【讨论】:

  • 我们不能在一个语句中做多个作业?我在哪里可以找到这个,我已经用谷歌搜索并阅读了文档,但我在任何地方都找不到。
  • 你不会发现大多数你不能用明确记录的语言做的事情:太多了,无法一一列举。如果你真的想要,你可以从语法中确定它。
【解决方案2】:

您不能在一行中使用多个赋值语句,如果需要,请在它们之间使用分号分隔。 在以下行 ListNode t1=h1,t2=h2;

写如下 t1=h1; t2=h2;

【讨论】:

  • 正如您在接受的答案中看到的那样,您不能在一行中执行多个作业。但是您可以声明几个变量并为它们赋值。所以 ListNode t1=h1,t2=h2;完全没问题
猜你喜欢
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多