在C中,对于被丢弃的语句,逗号和分号之间有什么区别

时间:2015-01-26 01:40:18

标签: c syntax conventions

我问,因为当我仔细阅读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忽略空格所以新行是无关紧要的?

非常令人费解。

1 个答案:

答案 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--)

您无法用分号替换这些逗号。