예시]
2
apple
say
=> 런타임에러
우선, 시작하면 left = 0, right = 1, 따라서 i = -1, j = 2가 됩니다. 이 때, (int)(i+j)/2 = 0입니다. 따라서, key_string = string[0] = apple 이겠죠.
추신) while문에서, 논리연산자는 좌측에서 우측으로 진행되므로, a || b && c = (a||b) && c 와 같으므로, 의도하신대로 작동하지 않을 수 있습니다.
1. 첫번째 while
첫번째, while에 의해서 ++i , i=0이 되며 탈출합니다. ( 처음조건 || 2번째 조건 && 세번째 조건 )
처음 조건인 strlen(string[0]) < key_length는 만족하지 않으나 다음 조건인 strlen(string[0]) == key_length가 만족하므로, OR 연산에 의해 true이 됩니다. ( true && 세번째 조건 )
그 후, key_string과 사전순 비교, 두 값이 같으므로, false. => 따라서, true && false 이므로 false가 되어 탈출.
2. 두번째 while
두 번째 while에 의해서, --j에 의해, j = 1이 되며 탈출합니다. ( 처음조건 || 2번째 조건 && 3번째 조건 ), string[1] = say
첫 조건인 strlen(string[1])=3 > key_length는 만족하지않고, 다음 조건인 strlen(string[1]) == key_length 조건도 만족하지 않으므로, OR 연산에 의해 false가 됩니다.
( false && 세번째 조건 ), 세번째 조건을 확인할 필요 없이 AND 연산에 의해 false. => 따라서, false가 되어 탈출.
3. 그 이후의 과정
string[0]과 string[1]이 서로 교환됩니다. 그리고, 아직 j가 더 크므로, 전체 while을 다시 돌게 됩니다.
그러고나서, 첫번째 루프로 가서, ++i로, i는 1이 됩니다. 그러면, string[0] = say ,string[1] = apple가 됩니다.
그런데, key_string은 여전히, string[0]을 가리키므로, key_string = say가 됩니다. 그러나 key_length는 변하지 않았으므로 key_length는 여전히 apple, 5 입니다.
첫 조건인, strlen(string[1]) < key_length는 는 만족하지 않지만, 다음 조건인 strlen(string[1]) == key_length는 만족하므로, true || false = true
세번째 조건인, 사전순에서, apple은 say보다 앞에 있으므로, true, => 따라서 true&&true가 되므로, 배열의 인덱스가 넘어갈 때까지 루프가 진행됩니다.
pjs8927 3년 전
답은 다 정확히 나옵니다
메모리가 넘어가는 건지 중간에 끊기는 부분이 있는 건지 모르겠습니다.
시간도 안넘을 것 같은데 왜 런타임 에러가 뜨는지 알려주세요~.~