printf 계열 함수의 형식 지정자로 퍼센트 부호 (%)가 선택된 이유는 무엇입니까?


27

적어도 C에서는 printf함수 계열 을 사용하여 서식이 지정된 문자열을 인쇄 한다는 것을 누구나 알고 있습니다. 이러한 함수는 퍼센트 부호 ( %)를 사용 하여 형식 지정자의 시작을 나타냅니다. 예를 들어, %d를 인쇄하는 수단 int, 및 %u의미를 인쇄 unsigned int. printf함수 및 형식 자리 표시자가 작동 하는 방식에 익숙하지 않거나 단순히 새로 고침이 필요한 경우 Wikipedia 기사 를 시작하는 것이 좋습니다.

내 질문은, 이것이 원래 또는 미래에 형식 지정자로 선택되어야하는 특별한 이유가 있습니까?

분명히 결정은 오래 전에 이루어졌으며 (C 언어의 전임자에게도 가능성이 높았 음) 그 이후로 거의 "표준"이되었습니다 (C뿐만 아니라 다른 여러 언어에서도). 구문을 다양한 각도로 채택 했으므로 너무 늦어서 변경되지 않습니다. 그러나 누군가 왜이 선택이 처음에 이루어질 수 있었는지, 그리고 비슷한 기능을 가진 새로운 언어를 디자인 할 때 선택이 적절한 지에 대한 통찰력이 있는지 궁금합니다.

예를 들어 C # (및 다른 .NET 언어 제품군)을 사용하여 Microsoft는 문자열 형식화 기능의 작동에 대해 약간 다른 결정을 내 렸습니다. printfC 의 구현과 달리 어느 정도의 유형 안전이 시행 될 수는 있지만 해당 매개 변수의 유형을 표시 할 필요는 없지만 색인이없는 중괄호 쌍 ( {}) 을 사용하기로 결정했습니다. 다음과 같이 형식 지정자로 사용하십시오.

string output = String.Format("In {0}, the temperature is {1} degrees Celsius.",
                              "Texas", 37);
Console.WriteLine(output);

// Output:
//     In Texas, the temperature is 37 degrees Celsius.

String.Format메소드의 일반적인 복합 형식에 대한 기사와 마찬가지로 메소드 의 문서 에는 자세한 정보가 포함되어 있지만 정확한 세부 사항은 중요하지 않습니다. 요점은 단순히 %형식 지정자의 시작을 나타내는 데 사용 하는 오랜 관행을 버렸다는 것 입니다. C 언어는 단지 쉽게 사용할 수도 {d}{u},하지만하지 않았다. 왜,이 결정이 회고에 적합한 지, 그리고 새로운 구현이 그것을 따라야하는지에 대해 어떤 생각이 있습니까?

분명히 이스케이프 가능한 그래서이 문자열 자체에 포함 할 수 있어야하지 않을 것을 선택 할 수없는 문자가 없습니다, 그러나 그 문제는 아주 잘 만 사용하여 이미 해결 그들입니다. 다른 고려 사항은 무엇입니까?


5
이스케이프 문제는 두 문자를 사용하여 해결 되지 않습니다 . 그것은 당신이 탈출 할 캐릭터가 하나 더 있다는 것을 의미합니다.
JJJ

2
궁금합니다. 확실히, {u}대신에 사용 하는 것이 가능 %u하지만 상당한 이점이 있습니까? 거의 임의적 인 선택처럼 보입니다.
CB Bailey

12
@JarrodRoberson 그래서 {}C #을 배우는 사람들이 다른 것을 배우지 않기 위해 의도적으로 구문을 선택했다고 말하고 있습니까? 나는 그것이 디자인 결정의 주요 부분이라고 생각하기가 매우 어렵다는 것을 안다. 어떻게 든 진술을 뒷받침 할 수 있습니까?
stijn

6
흥미롭게도 파이썬은 .NET 형식 과 비슷한 것을 선호하여 (매우 우수한 형식의) %형식 을 포기했습니다 . {}
Konrad Rudolph

3
하늘색은 왜되며 왜 "파란색"이라는 단어가 파란색입니까? 그들은 무언가를 골라야했다.

답변:


12

@Secure가 지적했듯이 C의 printf기능은 BCPL의 writef기능에서 영감을 얻었습니다 . BCPL 에 대한 Wikipedia 페이지를 보면 BCPL 이 형식 지정자를 소개하는 writef데 사용 된 예도 있습니다 %.

따라서 %BCPL이했기 때문에 또는 BCPL이했던 것과 같은 이유로 C가 사용 된 것으로 추론 할 수 있습니다 . 내 직감은 그것이 %가장 일반적으로 사용되는 ASCII 문자 중 하나 라는 것 입니다 ... 또는 저자가 생각했습니다. 또한 다양한 대안을 계량하는 데 많은 시간을 소비하지 않았을 가능성이 있습니다. 그 당시 BCPL과 C는 모호한 언어였으며 저자들은 다루어야 할 중요한 것들이 가장 많았습니다.

그러나 작품에는 작은 스패너가 있습니다. C는 BCPL에서 영감을 받았지만 C가 BCPL I / O 라이브러리를 빌 렸는지 아니면 다른 방법으로 빌 렸는지는 명확하지 않습니다. BCPL의 I / O 라이브러리는 infix byte indexing operator가 언어에 추가 된 시간에 대해 진화 과정을 거쳤다는 것을 어렴풋이 기억합니다. (실제로, 누가 그것에 대해 알고 있는지 알고 있습니다.)


3
"실제로, 나는 누가 그것에 대해 알고 있을지 안다고 생각합니다"... 그리고? ... 그리고? .. 그냥 절벽 걸이로 우리를 떠나지 마십시오 ...
Mawg

2
@Mawg-Brian Knight는 아마도 그럴 것입니다. 이안 윌슨은 아마 할 것입니다. 마틴 리차즈는 분명히 그렇습니다. HTH.
Stephen C

6

Wikipedia 항목에는에 관한 특정 기록이 많지 않고 printf일반적인 문자를 이스케이프 처리 하는 내용이 포함되어 있습니다 .

http://en.wikipedia.org/wiki/Escape_character

"이스케이프 문자"라는 용어에 대한 초기 언급은 Bob Bemer의 IBM 기술 문서에 있습니다. 분명히 ASCII 문자 집합에 대한 작업 중에이 메커니즘을 발명 한 사람입니다.

내 추측은 : 백 슬래시는 이미 문자열 리터럴에 사용되고 다른 문자열은 형식 문자열에 필요했습니다. 대부분의 사람들은 정상적인 사용 및 발생 빈도가 가장 적은 것으로 가정했습니다.

BTW, 다른 관련 기사는 내가 전에 들었던 용어와 관련이 있습니다.

http://en.wikipedia.org/wiki/Leaning_toothpick_syndrome

에 대한 기사 printf에는 더 많은 정보 스 니펫이 있지만 그 이유는 아닙니다.

http://en.wikipedia.org/wiki/Printf

C의 variadic printf는 BCPL의 writef 함수에서 시작되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.