C 언어 초보 질문

익명 사용자의 이미지

1) #include
main()
{
printf("Keep looking!\n");
printf("You \' ll find it!\ \n");
return 0;
}
이게 컴파일 에러 납니다.
unknown escape sequence `\' followed by char code 0x20
그런데.........
printf("You \' ll find it!\\n");
이건 에러가 안납니다.

또,,,,, printf("You \'ll find it!\\n");
이건 에러가 안납니다.
띄어 쓰기 차이로 에러가 안나다니........
이해가 안됩니다.
gcc -HancomLinux 2.2 2.96-99hl 입니다.

2) 위의 소스에서 return 0;
이걸 적어주는것과 안적어 주는것에 무슨 차이가 있나요?
제가 알기론 main() 이 반환치가 없어서 적어주나 안적어주나 상관없는걸로 아는데
그래도 적어 주는 이유가 있나요?

3) return 0;
이부분에서 숫자 0(zero) 대신에
return 2342345324523; 이라고 적으니까
warning decimal constant is so large that it is unsigned 이렇게 나옵니다.
그리고
return 2.23423254; 는 에러가 안납니다.

숫자의 한계치가 어디까지 인지 궁금합니다.
그리고 숫자가 의미하는게 무엇인지도 알고 싶구요..

익명 사용자의 이미지

1일째 wrote..
1) #include <stdio.h>
main()
{
printf("Keep looking!\n");
printf("You \' ll find it!\ \n");
return 0;
}
이게 컴파일 에러 납니다.
unknown escape sequence `\' followed by char code 0x20

\가 escape sequence 문자인데 두번째 \뒤에 white space character(빈칸)이 들어가서 그렇습니다.
\t \n 처럼 특정한 문자들이 들어가야 합니다.

그런데.........
printf("You \' ll find it!\\n");
이건 에러가 안납니다.

에러가 안나는 이유는 \\가 하나의 문자로 인식되기 때문입니다. 즉 역슬래쉬 문자로 인식되는거죠.
그러나 덕분에 맨 마지락 n은 개행문자(newline character)가 아니라 그냥 문자 n으로 인식됩니다.
이건 에러는 아니지만 원래의 의도가 아니기 때문에 오류라고 할 수 있습니다.


또,,,,, printf("You \'ll find it!\\n");
이건 에러가 안납니다.
띄어 쓰기 차이로 에러가 안나다니......

첫번째 \는 아무 문제가 없습니다. 띄어쓰나 붙여쓰나. 문제는 두번째와 세번째 \에 있는겁니다.

이해가 안됩니다.
gcc -HancomLinux 2.2 2.96-99hl 입니다.

컴파일러 패키지와는 상관이 없는 것 같습니다.


2) 위의 소스에서 return 0;
이걸 적어주는것과 안적어 주는것에 무슨 차이가 있나요?
제가 알기론 main() 이 반환치가 없어서 적어주나 안적어주나 상관없는걸로 아는데
그래도 적어 주는 이유가 있나요?

위의 main()은 앞에 생략되긴 했지만 리턴 값이 int 입니다. 따라서 정수값이 반환되죠. 만약 마지막 return 0;이 없으면
맨마지막 statement의 리턴값이 main()의 리턴값이 됩니다. 이 경우에는 두번째 printf 함수의 리턴값이 되겠죠.
가끔 실행파일을 실행시킨 후 종료상태 여부(정당하게 종료된건지 비정상적으로 종료된건지)를 알아야 할 때가 있습니다.
(bash의 경우 명령어 종료한 후 막바로 echo $? 하면 알수 있습니다.)
이때 return 0;을 생략한 경우에는 다소의 혼동이 있을 수 있겠죠. 정상적인 종료인 경우에도 리턴값이 0이 아닐 수 있으니까요.


3) return 0;
이부분에서 숫자 0(zero) 대신에
return 2342345324523; 이라고 적으니까
warning decimal constant is so large that it is unsigned 이렇게 나옵니다.

리턴값이 int 타입(대개 4바이트)인데 숫자가 너무 커서 그렇습니다.

그리고
return 2.23423254; 는 에러가 안납니다.

2.23423254라는 부동소수점 수가 정수값으로 casting되어서 그렇습니다. 이 경우에는 2입니다.


숫자의 한계치가 어디까지 인지 궁금합니다.
그리고 숫자가 의미하는게 무엇인지도 알고 싶구요..

보통 유닉스 계열 명령어들은 성공적인 종료일 때 0, 그렇지 않을 때는 1부터 255까지의 종료 상태 코드를 리턴합니다.
위에서 설명할 것처럼 사용자가 echo $?해서 명령어가 어떤 상태로 종료된 것인지 알수 있는 것이죠.

익명 사용자의 이미지

리턴값을 돌려준다고 했는데,,,

여기서 리턴값이란게 종료상태를 알려주는( 정상종료, 비정상종료)역할만 하는겁니까?
리턴값을 왜 돌려줘야 하나요? (질문이 이상한가요?? ㅡ.ㅡ;)
돌려준다면,,,,,누구에게 돌려준다는 뜻입니까?

오늘 부터 C 언어 책보고 독학할려니까,,,,, 괴상한 질문이 머리속에 많이 떠올라서요.

익명 사용자의 이미지

리턴값을 돌려준다는 의미는 자신을 호출한 녀석에게 값 돌려준다는
말입니다...
그럼 메인함수(main)가 리턴을 하는 곳은 운영체체겠죠..
즉 운영체제가 실행시에 제어권을 메인함수로 부터 돌려 받을 때
return를 통해서 실행상태값을 돌려 받을 수 있습니다..
물론 return를 사용하지 않아도 상관은 없지만 warn이 나죠..
이는 프로세스 관리측면에서 이야기를 해야 될 겁니다..
상당히 고급 중에 고급이 프로세스 관리측면이라서 저도 실력이 안돼요..

그리고 main이 아닌 다른 함수에서 호출한 녀석이 원하는 결과값을
돌려 줄 때 return을 사용합니다.. 그럼 이만..

익명 사용자의 이미지

main()은 좀 특별한 함수이긴 하지만 다른 함수들과 별반 다를 것이 없습니다.

만일 main()함수에서 printf() 함수를 호출하면 printf() 함수는 자기 할 일을 다 하고 성공했을 경우 출력한 문자 수를,
실패했을 때는 -1을 main() 함수에 리턴합니다. 보통 printf() 함수의 리턴값을 체크하는 경우는 잘 없지만
그게 중요한 경우라면 main() 함수에서 printf() 함수가 몇 개의 문자를 출력했는지 확인하겠죠.

main() 함수도 마찬가지입니다. 보통의 main() 함수는 shell(정확히 개념이 안 잡히셨다면 터미날과
동일시하셔도 됩니다)에서 호출되니까 리턴값을 shell에 되돌려 주죠. 만일 main() 함수가 정상적인 종료일 경우 0을,
비정상적인 종료일 경우 1을 리턴하도록 작성된 함수라면 사용자는 main() 함수를 컴파일한 명령어를 실행한 후
"echo $?" 명령어를 통해서 종료상태를 확인할 수 있죠. 그래서 비정상적인 종료라면 원인을 찾아서 문제를 해결하구요.
특히 비정상적인 종료의 경우 각각의 경우마다 다른 리턴값을 되돌려 준다면 사용자 입장에서 어떤 이유 때문에
비정상적인 종료가 되었는지 알아내기도 쉽겠죠?

익명 사용자의 이미지

리턴값을 돌려준다고 해서.... 시험을 해봤는데요.
#include
main()
{
printf("Keep looking!\n");
printf("You \'ll find it!\\n");
}

return 0;
이부분을 빼고 컴파일한후에
# echo $?
18
이렇게 나오네요.
그런데..............

#echo $?
0
바로 다시 해보니 그대로 0 으로 나오네요.
그뒤에 몇번 해봐도 0(zero)로 나오는데....이건 왜그렇죠?
한번은 비정상종료값을 받았는데... 그뒤부터는 정상종료값을 받는다??? ㅡ.ㅡ;
귀찮게 해드려서 죄송합니다.

익명 사용자의 이미지

첫 번째 echo $?는 main() 함수의 리턴값을 출력합니다. echo $?는 이전 명령어의 리턴값을 출력한다고 했으니까요.
그러니까 두 번째 echo $?는 첫 번째 echo $?의 리턴값을 출력하고 세번째 echo $?는 두 번째 echo $?의 리턴값을
출력합니다. echo 명령어가 정상적으로 종료되었으니까 리턴값은 0이 되는거죠.

만일 main() 함수의 리턴값을 다시 출력하려고 하면 반드시 main() 함수를 다시 실행한 후에 echo $?를 실행해야 되겠죠?

익명 사용자의 이미지

귀찮게 했는데도 꼬박꼬박 대답해 주시고.... 정말 감사합니다.
공부 하면서 계속 질문하러 이곳에 와야겠네요.
^^;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.