虽然为code golf比赛编写了一些代码,但我注意到了一些奇怪的行为。例如:为什么C编译器不能捕获这个错误?
int main(void)
{
goto jmp;
char *str = "Hello, World!";
jmp:
puts(str);
}
与海湾合作委员会(和锵和MSVC)导致没有警告或错误编译,但运行它抛出SIGSEGV
。编译器怎么会不知道goto
跳过变量声明?
我决定测试了这一点,并重写的例子(错误):
int main(void)
{
goto jmp;
int x;
jmp:
putchar(x);
}
再次,编译产生任何错误。此外,执行时不会引发任何操作,但在MSVC中,该进程以非零退出代码退出。
这是怎么回事?这是我们不应该使用goto
s的另一个原因吗?第二个例子中怎么没有发现错误,而第一个例子是SIGSEGV
?
这是未定义的行为。您跳过了一个变量声明,并尝试稍后使用它。即使*尝试*做到这一点,它有什么意义?你期待什么样的结果? – InternetAussie
这不是编译器的工作。 – kaylum
@InternetAussie OP提到他是代码打高尔夫球。也许对[this](https://codegolf.stackexchange.com/q/23250/61563)有挑战? –