갑자기 생각난 의문, %%에 관해 (in C)

leesort의 이미지

printf의 argument로 '%'를 입력할때에
"%%"를 사용합니다.
" 를 출력할 때에나
\ 를 출력할 때 등등 백슬래쉬를 사용합니다. ex) "\"", "\\"...

단순히 '%'를 출력하기 위해
"\%" 이렇게 하지않고 "%%"이렇게 된 이유가 혹시 있을까요?

제가 약간이나마 짐작하는 것은 '%'를 percentage,
즉 수학 개념이 포함되어있음을 표시하기위해 단순 출력인 백슬래쉬랑
구분하는것 같기도 한데...

정확한 이유가 있을까요?

Tirin의 이미지

\ 문자의 경우에는 애초에 그에 해당하는 값으로 바뀝니다만, %는 printf, scanf를 통해 나오면서 바뀌잖습니까.

자세한건 다음 분이 -3-

- Tirin.

- Tirin.

esrevinu의 이미지

C에서 문자열은 큰 따옴표(")로 묶입니다. 그래서 문자열 내에 큰 따옴표가 들어갈 경우에 문제가 생기겠죠. 그래서 큰 따옴표를 넣을 때는 앞에 역슬래시(\)를 넣어서 다음에 올 따옴표는 문자열을 묶는 따옴표가 아니라 문자 그대로의 따옴표라고 말해 주는 것입니다. 제어문자도 보이는 문자로는 나타내기 어려우므로 역슬래시를 써서 표현을 하죠. 이것은 C언어 자체의 문법입니다.
그런데 printf나 scanf 등에서는 출력할 변수의 형이 무엇인지 알 필요가 있어서 문자열을 입력받는데 형지정자 기호로 퍼센트(%)를 쓰죠. printf나 scanf가 기본적으로 제공되지만 문법적인 것은 아니죠. 만약에 문자열 안에 역슬래시(\) 다음에 퍼센트(%)를 쓴다면 C 문법으로서 먼저 제어문자라고 판단을 할 것입니다. C 문법 기반 위에서 구현되어야 할 printf가 scanf가 이를 어기고 역슬래시를 다음에 오는 퍼센트를 퍼센트 문자 자체로 인식할 수가 없는 것이겠죠. 그래서 printf나 scanf는 퍼센트 두개(%%)를 그들만의 약속으로 퍼센트 문자 자체로 인식하게 한 것이죠.

엄밀하게 맞는 이야기는 아니겠지만 대충 이렇게 이해할 수 있겠네요.
--
foldl (flip (:)) [] "universe"

leesort의 이미지

C언어에서는 \% 라는 것을 사용할 이유가 엄밀히 말하면 없는데
printf, scanf등에서 \% 사용하면 C언어를 어기게 되서 따로 %%라 해놓은건가요?


------------------------------------------
------------사진은 제가 아님----------------
------------------------------------------

익명사용자의 이미지

특별한 이유는 없어 보입니다만 파싱이 더 단순해서 혹은 구현 당시에는 그게 더 단순해서가 아닐까요 ?

익명사용자의 이미지

\는 컴파일시에 특수문자를 입력하기위해 사용되는 문자이고..
%는 printf, scanf등의 function내부에서 format으로 인식하는 문자입니다.
%를 format문자가 아닌 % 문자 자체로 인식하라고 printf, scanf에게 알려줘야지
컴파일러한테 \% 해서 이거 % 문자다 라고 알려줘봐야 아무 소용 없겠지요..

익명사용자의 이미지

\는 문자열 상수 단계에서 처리되고 %는 printf 함수 내부에서 처리됩니다. 서로 다른 단계에서 처리가 이루어진다는걸 생각하면 왜 \%가 아닌지 쉽게 이해하실 수 있을 겁니다.

leesort의 이미지

좋은 지식들 감사합니다~


------------------------------------------
------------사진은 제가 아님----------------
------------------------------------------

댓글 달기

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