【问题标题】:what do comma operators do in an "eval()"?逗号运算符在“eval()”中做了什么?
【发布时间】:2013-03-16 23:45:28
【问题描述】:

我正在尝试学习 java,我在旧的 UIL 练习测试中遇到了这段代码,我无法弄清楚这部分代码在做什么。

d[i][j] = eval(d[i-1][j]+1
[i][j-1]+1, d[i-1][j-1] + cost); /* the commas confuse me, I don't know what to add to cost */

如果有帮助,这里是整个代码

private static int eval(int a, int b, int c) {
    int m;
    m = a;
    if (b < m)
        m = b;
    if (c < m)
        m = c;
    return m;
}

public static int comp(String s, String t) {

    int d[][];
    int n, m, i, j;
    char si, tj, cost;
    n = s.length();
    m = t.length();

    if (n == 0) {
        return m;
    }

    if (m == 0) {
        return n;
    }

    d = < * 1 >;

    for (i = 0; i <= n; i++) {
        d[i][0] = i;
    }

    for (j = 0; j <= m; j++) {
        d[0][j] = j;
    }

    for (i = 1; i <= n; i++) {

        si = s.charAt(i - 1);

        for (j = 1; j <= m; j++) {

            tj = t.charAt(j - 1);

            if (si == tj) {
                cost = 0;
            } else {
                cost = 1;
            }

            d[i][j] = eval(d[i - 1][j] + 1,
            d[i][j - 1] + 1, d[i - 1][j - 1] + cost);
        }
    }
    return d[n][m];
}

【问题讨论】:

  • 请格式化您的代码。 (使用编辑器中的 { } 按钮。)
  • 缺少一个逗号...
  • 我建议你给你的方法和变量起有意义的名字。正如你所看到的,你很难弄清楚你的程序做了什么以及为什么使用通用名称。
  • 多么好的方法名称eval(),我想到了另一个eval()....我刚刚google了一下,如果eval()被添加到最新版本的Jdk中...... . :(

标签: java comma


【解决方案1】:

方法中的逗号用于分隔参数。

如您所见,eval 方法需要树形参数

private static int eval (int a, int b, int c){

在您的代码示例中,您正在像这样调用它

        d[i][j] = eval(d[i - 1][j] + 1, //<-there is comma here in your code
        d[i][j - 1] + 1, d[i - 1][j - 1] + cost);

等于

d[i][j] = eval(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1] + cost);

所以参数a 将是d[i-1][j]+1b = d[i][j-1]+1c=d[i-1][j-1] + cost 的值

【讨论】:

    【解决方案2】:

    逗号只是用来分隔方法调用的不同参数,在这种情况下为eval()。例如,如果我们这样调用eval()

    eval(1, 2, 3)
    

    然后,在eval() 的主体内,参数将像这样绑定:

    a = 1
    b = 2
    c = 3
    

    【讨论】:

      【解决方案3】:

      在 Java 中,逗号永远不是运算符。它始终只是一个分隔符。

          d[i][j] = eval(d[i - 1][j] + 1,
                         d[i][j - 1] + 1, 
                         d[i - 1][j - 1] + cost);
      

      在这种情况下,它只是分隔方法调用中的实际参数表达式。 (我已经修复了缩进以明确这一点。)

      因此,在您的示例中,逗号只是分隔 eval 调用的 3 个参数表达式。也许你只是被一些“非标准”的缩进误导了。


      (在 C 和 C++ 中, comma operator;例如

          a = x(), y();
      

      表示调用x 并丢弃结果,然后调用y 并将结果分配给a。但是,该语句不是有效的 Java 代码。)

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多