함수의 리턴값중 성공과 실패에 대해..
글쓴이: huricool / 작성시간: 수, 2003/05/07 - 1:56오후
궁금한게 있어서 질문 올립니다.
strcmp() 의 경우는 문장이 일치 하는경우 0 을 리턴하게 되는데 이 함수를
조건문에 사용하게 되면
if(!strcmp(a,b)) {
}
이런식으로 써야 a,b 두개의 문장이 일치할때 함수가 실행됩니다.
strcmp 같은 함수의 성공은 0 실패는 1을 반환하게 되는데요.
보통 어떤 함수들은 성공을 1 실패를 0 을 반환하는 경우도 있고
strcmp 처럼 반대로 리턴하는 경우도 있는데 각 함수들의 사용에 있어
리턴값 정의가 다른건 어떤 이유가 있어서 일까요?
혼자서 생각해 보려니 머리가 아퍼서 질문 올립니다.
그럼 조언좀 부탁드립니다.
Forums:
함수의 return 값이야 만든사람 맘이니깐 미리 man page 로
함수의 return 값이야 만든사람 맘이니깐
미리 man page 로 확인을 해보시고요
strcmp(a, b) 계열 함수의 경우 문자열이 같을때 0, 실패일때 1을 리턴하는게
아니라 a, b 문자열을 비교해서 서로 다른 문자가 나올때 그 문자의 Ascii code 차이를 리턴하게 됩니다. 그래서 같은 문자열이면 0이 나오게 되고, 다른 문자열일 경우 0이 아닌 정수가 리턴이 되게 됩니다.
이것 역시 man page 를 확인해 보세요...
from saibi
Re: 함수의 리턴값중 성공과 실패에 대해..
잘못 알고 계시군요.
strcmp(a, b)는 a와 b를 사전식(Lexicographical) 순서로 비교하여
a가 b보다 적으면 음수(ANSI 표준에 따르면 음수이면 어떤 값이든 상관 없습니다.), 같으면 0, 크면 양수(역시 어떤값이든 상관없음)을 리턴합니다.
그러므로 두 문자열의 같다는 것을 비교하는 정확한 코드는 다음과 같아야 합니다.
참고로 C99와 C++98은 기본적으로 bool 타입을 지원합니다.
다른 타입이 bool로 캐스팅될 때는 0값은 false로, 0이 아니면 true로 캐스팅됩니다.
true와 false의 의미가 아닌 경우에는 님의 코드와 같은 식으로 쓰는 것은 좋지 않습니다.
[quote="cedar"]잘못 알고 계시군요.strcmp(a, b)
단, "사전식" 순서라는 보장은 없습니다. implementation 이 사용하는 실행문자셋
(execution character set) 의 collating sequence 에 의존한 결과일 뿐입니다
(실행문자셋에서 latin alphabet 이 사전식으로 배치된다는 보장이 없습니다).
실행문자셋과는 독립적으로 어떤 locale 에 의존하는 특수한 순서를 보장해주는
비교 함수로는 strcoll() 가 있습니다 (물론, 이 경우에도 "사전식" 순서라는
보장은 없습니다만, 유의미한 대조를 위해 의도된 함수입니다).
가독성을 위해서는 "== 0" 을 분명히 해주는 것이 바람직한 문맥이지만, 언어적으로는
는 동일합니다. 따라서, "정확한" 코드라기 보다는 "보기 좋은" 코드에 해당합니다.
그럼...
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
[quote="전웅"]단, "사전식" 순서라는 보장은 없습니다. im
제가 말한 사전식(lexicographical)의 의미는 strcmp나
std::basic_string의 operator<, operator>,
std::lexicographical_compare 에서 사용되는 비교 알고리듬의 방식에 대한 거지, 실제 자연어의 사전에 있는 순서라는 의미가 아닙니다.
즉, a[m], b[n]을 비교할때,
a[0]와 b[0]을 비교하여
a[0] < b[0] 이면 음수를, a[0]> b[0]이면 양수를 리턴하고,
a[0] == b[0]이면 a[1]과 b[1]을 비교하는 방식을 계속하여
(즉, a[i] == b[i]이면 a[i+1]과 b[i+1]을 비교)
대소를 결정하는 알고리듬을 사전식 비교 알고리듬이라고 합니다.
제 표현이 "정확하지" 않았던 것 같네요.
저는
if (strcmp(a, b) == 0)
라고 써야 strcmp가 가진 "정확한 의미"를 나타낸다는 뜻으로 쓴 겁니다.
즉, if ()안에 있는 표현식(expression)은 항상 불린식(boolean expression)이 되도록 해야 올바른(가독성이 좋은) 코드라는 것을 강조하려는 의도였습니다.
[quote="cedar"]제가 말한 사전식(lexicographical
그렇다면 그 용어의 사전적 정의를 잘못 알고 계신 것입니다. 일부 컴퓨터 관련 서적 및
문서에서 lexicographical order 라는 용어를 위와 같은 의미로 간단히 사용하는 경우는
그 기반에 해당 character set 의 collating sequence 자체가 alphabetical order 를
보장해 준다는 사실을 가정으로 이루어지는 것입니다. NITS 의 Dictionary of Algorithms
and Data Structures 에서 인용합니다.
lexicographical order
Definition: Alphabetical or "dictionary" order.
가독성은 상대적인 것입니다. strcmp() 와 같이 C 언어의 일반적인 true/false 관례와 다른
경우에는 "저"는 동의합니다만, "모든" 경우에 조건 분기의 수식의 명백한 boolean expression
이 되어야 한다는 사실에는 동의하지 않습니다 - 이는 스타일과 관련된 문제이므로 그 누구도
특정 형태를 강요할 수 없는 부분입니다.
그럼...
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
제 글에 오해의 여지가 있어 부언합니다.물론, cedar 님께서
제 글에 오해의 여지가 있어 부언합니다.
물론, cedar 님께서 기술하신 형태의 알고리즘을 lexicographical order 를 위한 알고리즘
이라고 부를 수 없다는 뜻은 아닙니다. lexicographical order 의 수학적 정의와 보다
일반적으로 통용되는 사전적 정의가 다를 수 있기에 lexicographical order 가
alphabetical order 로 이해될 수 있음을 강조한 것입니다.
그럼...
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기