我正在阅读一些关于编写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时才会出现)
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)
C是一种简单,极简主义的语言,程序员应该知道他们在做什么.
在C中,类型很容易相互转换,原始的C甚至没有函数声明 - 程序员应该知道如何调用每个函数以及使用什么参数.
C是Unix和Unix的编程语言
"UNIX并不是为了阻止你做蠢事,因为这也会阻止你做一些聪明的事情." - Doug Gwyn(https://en.wikiquote.org/wiki/Unix)
作为奖励,如果编译器不尝试智能,编译可以非常快.
C++采用了一种截然不同的方法.
至于,运营商的实际应用,请查看:https:
//en.wikipedia.org/wiki/Comma_operator
逗号运算符具有相对有限的用例.因为它丢弃了它的第一个操作数,所以它通常仅在第一个操作数具有所需副作用的情况下才有用.此外,因为它很少在特定习语之外使用,并且容易与其他逗号或分号混淆,所以它可能容易混淆和容易出错.然而,在某些情况下,它是常用的,特别是在for循环和SFINAE中(http://en.cppreference.com/w/cpp/language/sfinae).对于可能具有有限调试功能的嵌入式系统,逗号运算符可以与宏结合使用,以无缝覆盖函数调用,在函数调用之前插入代码.