code golf 경쟁 코드를 작성하는 동안 몇 가지 이상한 동작이 나타났습니다. 예를 들어 :C 컴파일러가이 오류를 잡아 내지 않는 이유는 무엇입니까?
int main(void)
{
goto jmp;
char *str = "Hello, World!";
jmp:
puts(str);
}
GCC (와 연타 및 MSVC) 어떤 경고 또는 오류의 결과로 컴파일하지만 실행은 SIGSEGV
가 발생합니다. 컴파일러가 goto
이 변수 선언을 뛰어 넘고 있다는 것을 어떻게 알지 못합니까? (? 버그)
int main(void)
{
goto jmp;
int x;
jmp:
putchar(x);
}
는, 컴파일이 오류를 얻을 수 없습니다합니다. 또한 실행시 아무 것도 throw되지 않지만 MSVC에서는 프로세스가 0이 아닌 종료 코드로 종료됩니다.
여기 무슨 일 이니? 이것은 단순히 goto
을 사용하지 않아야하는 또 다른 이유입니까? 그리고 두 번째 예제에서 오류가 발생하지 않는 이유는 무엇입니까? SIGSEGV
은 처음에 throw됩니까?
이것은 정의되지 않은 동작입니다. 변수 선언을 건너 뛰고 나중에 사용하려고합니다. 이것을하려고 시도하는 것조차도 어떻게 이해할 수 있습니까? 어떤 결과가 예상됩니까? – InternetAussie
그건 컴파일러의 직업이 아니에요. – kaylum
@InternetAussie OP는 그가 코드 골프라고 언급했습니다. 어쩌면 [this] (https://codegolf.stackexchange.com/q/23250/61563)에 도전 할 수 있을까요? –