gofkdvjvl   4년 전

위의 코드가 런타임 에러가 난 코드이고 밑에가 if문을 continue로 넘어가도록 수정했더니 통과한 코드입니다. 

문제를 풀긴 했는데 도저히 첫 번째 코드가 런타임에러난 범위를 찾지 못해 스트레스 받아 질문 올립니다 ㅠㅠ 

큐에 넣기전 if문 안에  0이상 10만 이하 조건으로 검사시켜 주었는 데도 왜 에러가 나는 것일까요...?? 

visited는 100001로 했습니다 

seico75   4년 전

if 문 안에서 조건식들은 좌->우로 평가가 됩니다. 

아래 코드는 a[i] 가 음수일 경우에 visited[a[i]] 부터 평가가 되어서 런타임 에러가 납니다.

if(!visited[a[i]] && a[i]>=0 && a[i]<=100000)


아래와 같이 고치면 될 것 같습니다.


if( a[i]>=0 && a[i]<=100000 && !visited[a[i]] )


miles94   4년 전

위에 분 말씀대로 if 문 안에서 평가(evaluation) 이 이뤄질 때 

C++ 의 경우 단락회로평가(short-circuit evaluation) 방법을 사용하여, 

if ( eval1 && eval2) 의 경우 eval1 이 거짓일 경우 eval2 를 실행하지 않으며, if 문 속으로 jump 하지 않고

if( eval1 || eval2) 의 경우 eval1 이 참일 경우 eval2 를 실행하지 않고 if 문을 만족하는 것으로 보고 구문으로 jump 합니다.

따라서 질문 주신대로 런타임에러가 나거나 그런 것을 C++ 은 순서로 방지할 수 있습니다.

간단한 예시로,

if ( b!=0 && a/b == 3) {...} 같은 경우를 보면, 만약 b 가 0 인 경우, 앞의 조건에서 if 문을 만족시키지 않기 때문에

a/b를 검사하지 않게 됩니다. 만약 검사했다면 0 으로 나눴기 때문에 program 이 halt 됩니다.

참고로, 다른 언어의 경우 Full-circuit evaluation 을 쓰는 언어도 있는데 이 경우, 순서와 상관없이 모든 평가를 진행하기 때문에 

오류가 발생할 수 있습니다.

gofkdvjvl   4년 전

몰랐던 사실이군요 

친절하게 설명해주셔서 감사합니다 

댓글을 작성하려면 로그인해야 합니다.