用逗号返回语句

这是cat用 C 编写的流行 bash 命令。

我不知道这条线是做什么的:

if (argc==1) return cat(stdin), 0;

我以前从未见过类似的东西。这是完整的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void cat(FILE *f)
{
        int     c;

        while (EOF != (c = getc(f)))
        {
                if (EOF == putchar(c))
                {
                        perror("cat");
                        return;
                }
        }
        if (ferror(f))
        {
                perror("cat");
                return;
        }
}

int main(int argc, char **argv)
{
        if (argc==1) return cat(stdin), 0;
        for(int i=1; i<argc; i++)
        {
                if (!strcmp("-", argv[i]))
                {
                        cat(stdin);
                        continue;
                }
                FILE *f = fopen(argv[i], "r");
                if (!f)
                {
                        perror("cat");
                        continue;
                }
                cat(f);
                fclose(f);
        }
        return 0;
}

线有if (argc==1) return cat(stdin), 0;什么作用?

回答

这个:

cat(stdin), 0

是一个逗号表达式。这种表达式按从左到右的顺序计算所有操作数(用逗号分隔),每个逗号处都有一个隐式序列点,最后返回最右边操作数的值(在本例中为0)。

例如,这里:

int x = (1, 2, 3, 4);

变量x假定值为4。在某些情况下,表达式需要用括号括起来以避免歧义(例如,就像我上面所做的那样)和不需要它的情况(例如在 之后return)。

总而言之,很少有逗号表达式有意义的情况,这当然不是其中之一。您显示的代码可以重写为:

if (argc == 1) {
    cat(stdin);
    return 0;
}

使用return cat(stdin), 0;简单地cat(stdin)在返回之前执行0。使代码适合一行是一种愚蠢的“技巧”。


以上是用逗号返回语句的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>