雖然爲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)有挑戰? –