我问,因为当我仔细阅读grep的源代码时,我注意到它使用了C语法的元素,逗号,我不习惯看到它,例如:
r = links[depth], l = r->llink, t = l->rlink;
rl = t->rlink, lr = t->llink;
t->llink = l, l->rlink = lr, t->rlink = r, r->llink = rl;
我研究了用法,发现:
当用作运算符时,逗号运算符使用以下语法:
expr1, expr2
左操作数expr1被计算为void表达式(即,如果不包含副作用则忽略它),然后计算expr2以给出逗号表达式的结果和类型。所以,结果只是expr2。
(来源:http://tigcc.ticalc.org/doc/opers.html#comma)
因此,如果逗号运算符确实是#34;相同的"作为分号(当然,假设我们不需要使用表达式的返回值),在写作中
f(2); g(3);
在功能上等同于写作
f(2), g(3);
甚至
f(2), g(2),
为什么我们使用分号代替?为什么没有grep作者只遵循约定并使用分号而不是逗号,因为C忽略空格所以新行是无关紧要的?
非常令人费解。
答案 0 :(得分:3)
在显示的代码中,逗号可以用分号代替,并且代码的工作方式没有区别。这可能只是一种强调三种操作密切相关的方式。
但是,有时候差异很重要。例如:if (links[depth] != 0)
r = links[depth], l = r->llink, t = l->rlink;
VS
if (links[depth] != 0)
r = links[depth]; l = r->llink; t = l->rlink;
尽管编写方式,编译器仍然看到:
if (links[depth] != 0)
r = links[depth];
l = r->llink;
t = l->rlink;
这根本不是一回事。它在for
循环的循环初始化和重新初始化部分中也很重要:
int i, j;
…
for (i = 0, j = max; i < j; i++, j--)
您无法用分号替换这些逗号。