【问题标题】:Return statement with comma用逗号返回语句
【发布时间】:2021-10-06 22:29:39
【问题描述】:

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

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

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; 行有什么作用?

【问题讨论】:

  • 我已编辑您的问题以使其更清晰。

标签: c linux return cat


【解决方案1】:

这个:

cat(stdin), 0

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

例如,这里:

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

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

总而言之,在极少数情况下逗号表达式是有意义的,而这肯定不是其中之一。您显示的代码可以重写为:

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

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

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2020-10-19
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多