我想知道为什么可以编译这段代码:
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
printf("shouldnt allow this line");
return 1; //also this line
}
行printf("shouldnt allow this line");
和return 1;
无法访问,为什么编译器允许这样做?
我使用gcc 4.8和onlinegdb测试了它。
答案 0 :(得分:3)
无法访问的代码不是错误,因为:
它通常很有用,特别是作为宏扩展或函数的结果,这些函数只是因为某些路径因某些参数不变或被限制在特定范围而导致某些路径无法访问。例如,对于仅使用非负参数调用的内联版本isdigit
,EOF
参数的代码路径将无法访问。
通常,确定代码是否无法访问等同于暂停问题。当然,像你这样的某些案例很容易确定,但是你无法指定类似于&#34的东西;无法访问的代码的琐碎案例是错误,但是重要的案例不是&#t;#34;。
答案 1 :(得分:1)
从广义上讲,C并不旨在帮助开发人员捕捉错误;相反,C信任开发人员做一个完美的工作,就像它信任编译器做一个完美的工作一样。
许多较新的语言采取更积极的立场,旨在保护开发人员免受他们自己的攻击 - 并且大量的C编译器会发出编译警告(通常可以通过命令提升错误#34; line flags) - 但C社区从未希望语言停止信任开发人员。这只是一个哲学上的差异。 (如果你遇到一种语言阻止你做一些看似错误的事情而你实际上有充分理由的情况,你可能会理解他们来自哪里,甚至如果你不同意的话。)