[英]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.