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)
。使代码适合一行是一种愚蠢的“技巧”。
这是流行的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)
。使代码适合一行是一种愚蠢的“技巧”。