C函数调用后跟逗号分隔符

rka*_*ach 4 c language-design

我正在阅读一些关于编写C程序时应该避免的错误的材料,我遇到了以下代码:

#include <stdio.h>

void foo(int param)
{
  printf("foo is called\n");
  printf("%d\n",param);
}

int main()
{
  return foo,(1);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码构建没有错误和警告(它只在-Wall被激活时显示警告)但是当我运行小程序时没有显示任何内容.由于逗号分隔符,不调用函数foo.

我的问题是为什么C标准允许这样的语法?在这种情况下编译器不应该发出错误吗?在哪种情况下,这种语法可以在一些实际用例中使用?

提前致谢,

PD:我正在使用GCC 4.8.3

编辑:

在这种情况下,编译器无法检测到这种情况并发出错误而不是警告(正如我所说,只有在启用-Wall时才会出现)

R S*_*ahu 5

return foo,(1);
Run Code Online (Sandbox Code Playgroud)

相当于:

foo; // Nothing happens. This does not call the function.
return (1);
Run Code Online (Sandbox Code Playgroud)

也许你打算用:

foo(1);
return 1;
Run Code Online (Sandbox Code Playgroud)


PSk*_*cik 5

C是一种简单,极简主义的语言,程序员应该知道他们在做什么.

在C中,类型很容易相互转换,原始的C甚至没有函数声明 - 程序员应该知道如何调用每个函数以及使用什么参数.

C是Unix和Unix的编程语言

"UNIX并不是为了阻止你做蠢事,因为这也会阻止你做一些聪明的事情." - Doug Gwyn(https://en.wikiquote.org/wiki/Unix)

作为奖励,如果编译器不尝试智能,编译可以非常快.

C++采用了一种截然不同的方法.

至于,运营商的实际应用,请查看:https: //en.wikipedia.org/wiki/Comma_o​​perator

逗号运算符具有相对有限的用例.因为它丢弃了它的第一个操作数,所以它通常仅在第一个操作数具有所需副作用的情况下才有用.此外,因为它很少在特定习语之外使用,并且容易与其他逗号或分号混淆,所以它可能容易混淆和容易出错.然而,在某些情况下,它是常用的,特别是在for循环和SFINAE中(http://en.cppreference.com/w/cpp/language/sfinae).对于可能具有有限调试功能的嵌入式系统,逗号运算符可以与宏结合使用,以无缝覆盖函数调用,在函数调用之前插入代码.