繁体   English   中英

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

[英]In C, what is the difference between comma and semicolon for statements that are discarded

我问是因为在我仔细阅读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

因此,如果逗号运算符确实与分号“相同”(当然,假设我们不需要使用表达式的返回值),

f(2); g(3);

在功能上等同于写作

f(2), g(3);

甚至

f(2), g(2),

为什么我们使用分号代替? 为什么grep作者不遵循约定并使用分号代替逗号,因为C忽略空格,因此换行符无关?

非常令人困惑。

在所示的代码中,逗号可以用分号代替,并且代码的工作方式没有区别。 这可能只是强调这三个操作之间紧密相关的一种方式。

但是,有时候差异很重要。 例如:

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循环的循环初始化和重新初始化部分中也很for

int i, j;
…
for (i = 0, j = max; i < j; i++, j--)

您不能用分号代替那些逗号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM