Return 带逗号的语句

Return statement with comma

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

我不知道这行是做什么的:

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

是每个逗号处的comma expression. This kind of expression evaluates all the operands (separated by commas) in order from left to right, with an implicit sequence point,最后是returns最右边操作数的值(在本例中是0)。

例如,这里:

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

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

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

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

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