함수의 리턴값중 성공과 실패에 대해..

huricool의 이미지

궁금한게 있어서 질문 올립니다.

strcmp() 의 경우는 문장이 일치 하는경우 0 을 리턴하게 되는데 이 함수를
조건문에 사용하게 되면

if(!strcmp(a,b)) {

}

이런식으로 써야 a,b 두개의 문장이 일치할때 함수가 실행됩니다.
strcmp 같은 함수의 성공은 0 실패는 1을 반환하게 되는데요.
보통 어떤 함수들은 성공을 1 실패를 0 을 반환하는 경우도 있고
strcmp 처럼 반대로 리턴하는 경우도 있는데 각 함수들의 사용에 있어
리턴값 정의가 다른건 어떤 이유가 있어서 일까요?

혼자서 생각해 보려니 머리가 아퍼서 질문 올립니다.

그럼 조언좀 부탁드립니다.

new5244의 이미지

함수의 return 값이야 만든사람 맘이니깐
미리 man page 로 확인을 해보시고요

strcmp(a, b) 계열 함수의 경우 문자열이 같을때 0, 실패일때 1을 리턴하는게
아니라 a, b 문자열을 비교해서 서로 다른 문자가 나올때 그 문자의 Ascii code 차이를 리턴하게 됩니다. 그래서 같은 문자열이면 0이 나오게 되고, 다른 문자열일 경우 0이 아닌 정수가 리턴이 되게 됩니다.
이것 역시 man page 를 확인해 보세요...

from saibi

cedar의 이미지

huricool wrote:

strcmp() 의 경우는 문장이 일치 하는경우 0 을 리턴하게 되는데 이 함수를
조건문에 사용하게 되면
if(!strcmp(a,b)) {

}

이런식으로 써야 a,b 두개의 문장이 일치할때 함수가 실행됩니다.
strcmp 같은 함수의 성공은 0 실패는 1을 반환하게 되는데요.

잘못 알고 계시군요.
strcmp(a, b)는 a와 b를 사전식(Lexicographical) 순서로 비교하여
a가 b보다 적으면 음수(ANSI 표준에 따르면 음수이면 어떤 값이든 상관 없습니다.), 같으면 0, 크면 양수(역시 어떤값이든 상관없음)을 리턴합니다.
그러므로 두 문자열의 같다는 것을 비교하는 정확한 코드는 다음과 같아야 합니다.

if (strcmp(a, b) == 0) {

}

huricool wrote:

보통 어떤 함수들은 성공을 1 실패를 0 을 반환하는 경우도 있고

참고로 C99와 C++98은 기본적으로 bool 타입을 지원합니다.
다른 타입이 bool로 캐스팅될 때는 0값은 false로, 0이 아니면 true로 캐스팅됩니다.

true와 false의 의미가 아닌 경우에는 님의 코드와 같은 식으로 쓰는 것은 좋지 않습니다.

전웅의 이미지

cedar wrote:
잘못 알고 계시군요.
strcmp(a, b)는 a와 b를 사전식(Lexicographical) 순서로 비교하여
a가 b보다 적으면 음수(ANSI 표준에 따르면 음수이면 어떤 값이든 상관 없습니다.), 같으면 0, 크면 양수(역시 어떤값이든 상관없음)을 리턴합니다.

단, "사전식" 순서라는 보장은 없습니다. implementation 이 사용하는 실행문자셋
(execution character set) 의 collating sequence 에 의존한 결과일 뿐입니다
(실행문자셋에서 latin alphabet 이 사전식으로 배치된다는 보장이 없습니다).
실행문자셋과는 독립적으로 어떤 locale 에 의존하는 특수한 순서를 보장해주는
비교 함수로는 strcoll() 가 있습니다 (물론, 이 경우에도 "사전식" 순서라는
보장은 없습니다만, 유의미한 대조를 위해 의도된 함수입니다).

cedar wrote:
그러므로 두 문자열의 같다는 것을 비교하는 정확한 코드는 다음과 같아야 합니다.
if (strcmp(a, b) == 0) {

}

가독성을 위해서는 "== 0" 을 분명히 해주는 것이 바람직한 문맥이지만, 언어적으로는

if (!strcmp(a, b))
if (strcmp(a, b) == 0)

는 동일합니다. 따라서, "정확한" 코드라기 보다는 "보기 좋은" 코드에 해당합니다.

그럼...

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

cedar의 이미지

전웅 wrote:

단, "사전식" 순서라는 보장은 없습니다. implementation 이 사용하는 실행문자셋(execution character set) 의 collating sequence 에 의존한 결과일 뿐입니다.
(실행문자셋에서 latin alphabet 이 사전식으로 배치된다는 보장이 없습니다).
실행문자셋과는 독립적으로 어떤 locale 에 의존하는 특수한 순서를 보장해주는
비교 함수로는 strcoll() 가 있습니다 (물론, 이 경우에도 "사전식" 순서라는
보장은 없습니다만, 유의미한 대조를 위해 의도된 함수입니다).

제가 말한 사전식(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]을 비교)
대소를 결정하는 알고리듬을 사전식 비교 알고리듬이라고 합니다.

전웅 wrote:

가독성을 위해서는 "== 0" 을 분명히 해주는 것이 바람직한 문맥이지만, 언어적으로는
if (!strcmp(a, b))
if (strcmp(a, b) == 0)

는 동일합니다. 따라서, "정확한" 코드라기 보다는 "보기 좋은" 코드에 해당합니다.

제 표현이 "정확하지" 않았던 것 같네요.
저는 if (strcmp(a, b) == 0)
라고 써야 strcmp가 가진 "정확한 의미"를 나타낸다는 뜻으로 쓴 겁니다.
즉, if ()안에 있는 표현식(expression)은 항상 불린식(boolean expression)이 되도록 해야 올바른(가독성이 좋은) 코드라는 것을 강조하려는 의도였습니다.

전웅의 이미지

cedar wrote:
제가 말한 사전식(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]을 비교)
대소를 결정하는 알고리듬을 사전식 비교 알고리듬이라고 합니다.

그렇다면 그 용어의 사전적 정의를 잘못 알고 계신 것입니다. 일부 컴퓨터 관련 서적 및
문서에서 lexicographical order 라는 용어를 위와 같은 의미로 간단히 사용하는 경우는
그 기반에 해당 character set 의 collating sequence 자체가 alphabetical order 를
보장해 준다는 사실을 가정으로 이루어지는 것입니다. NITS 의 Dictionary of Algorithms
and Data Structures 에서 인용합니다.

lexicographical order

Definition: Alphabetical or "dictionary" order.

cedar wrote:
제 표현이 "정확하지" 않았던 것 같네요.
저는 if (strcmp(a, b) == 0)
라고 써야 strcmp가 가진 "정확한 의미"를 나타낸다는 뜻으로 쓴 겁니다.
즉, if ()안에 있는 표현식(expression)은 항상 불린식(boolean expression)이 되도록 해야 올바른(가독성이 좋은) 코드라는 것을 강조하려는 의도였습니다.

가독성은 상대적인 것입니다. strcmp() 와 같이 C 언어의 일반적인 true/false 관례와 다른
경우에는 "저"는 동의합니다만, "모든" 경우에 조건 분기의 수식의 명백한 boolean expression
이 되어야 한다는 사실에는 동의하지 않습니다 - 이는 스타일과 관련된 문제이므로 그 누구도
특정 형태를 강요할 수 없는 부분입니다.

그럼...

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

전웅의 이미지

제 글에 오해의 여지가 있어 부언합니다.

물론, cedar 님께서 기술하신 형태의 알고리즘을 lexicographical order 를 위한 알고리즘
이라고 부를 수 없다는 뜻은 아닙니다. lexicographical order 의 수학적 정의와 보다
일반적으로 통용되는 사전적 정의가 다를 수 있기에 lexicographical order 가
alphabetical order 로 이해될 수 있음을 강조한 것입니다.

그럼...

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.