逗号运算符在“eval()”中做了啥?
Posted
技术标签:
【中文标题】逗号运算符在“eval()”中做了啥?【英文标题】: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中...... . :(
【参考方案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]+1
、b
= d[i][j-1]+1
和c
=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 代码。)
【讨论】:
以上是关于逗号运算符在“eval()”中做了啥?的主要内容,如果未能解决你的问题,请参考以下文章