81

I learned today that there are digraphs in C99 and C++. The following is a valid program:

%:include <stdio.h>

%:ifndef BUFSIZE
 %:define BUFSIZE  512
%:endif

void copy(char d<::>, const char s<::>, int len)
<%
    while (len-- >= 0)
    <%
        d<:len:> = s<:len:>;
    %>
%>

My question is: why do they exist?

Sydius
  • 13,567
  • 17
  • 59
  • 76
  • 6
    Verify my translation? %: is #, and <% %> is {}, and <: :> is []. Is this correct? – abelenky Jan 11 '09 at 07:02
  • 10
    The real answer: because IBM was loud and insisted on forcing it on everyone. –  Dec 31 '14 at 05:57
  • 2
    Voting to reopen. That question is more specific than this (only about `and` and `or`). This one is posed on a more useful form and has more upvotes. Edit: should be a duplicate of: http://stackoverflow.com/questions/1234582/purpose-of-trigraph-sequences-in-c instead. – Ciro Santilli OurBigBook.com May 09 '16 at 15:06
  • 3
    The real answer: So you can write obfuscated code `:-)` – MD XF Oct 29 '16 at 04:38

5 Answers5

74

Digraphs were created for programmers that didn't have a keyboard which supported the ISO 646 character set.

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

CTT
  • 16,901
  • 6
  • 41
  • 37
  • 2
    Non-ASCII keyboards were not a problem. Sure it looked odd, but... main(int argc,char *argvÄÅ) ä printf("HelloÖn"); å – robinr May 06 '19 at 10:44
  • @robinr That it "looked odd" is exactly why the Scandinavians asked for digraphs and there was resistance on the C standards committee (X3J11, of which I was a member) to add them. – Jim Balter May 21 '23 at 17:49
  • @Pryftan The question is about digraphs, not trigraphs. As for "if wikipedia says this", you should read the Wikipedia article to see what it says rather than speculating. (The Wikipedia article is not wrong but this answer is.) – Jim Balter May 21 '23 at 17:51
28

I believe that their existence can be traced back to the possibility that somewhere, somebody is using a compiler with an operating system whose character set is so archaic that it doesn't necessarily have all the characters that C or C++ need to express the whole language.

Also, it makes for good entries in the IOCCC.

Greg Hewgill
  • 951,095
  • 183
  • 1,149
  • 1,285
  • 6
    Not necessarily the compiler, Greg. Some of the mainframe EBCDIC character sets don't have consistent characters for the square brackets, which rather stuffs up array processing. This is a limitation of the editor and/or terminal emulator more than the compiler itself. – paxdiablo Jan 11 '09 at 06:27
  • I didn't really mean it was only the compiler. I edited to clarify. – Greg Hewgill Jan 11 '09 at 06:51
  • No, it has nothing to do with EBCDIC. These sequences were for the sake of Scandinavians who used some of the ASCII characters as language characters (so the symbols were different on the keycaps and in output). – Jim Balter Feb 28 '14 at 08:18
  • 5
    The mention of [IOCCC](http://www.ioccc.org/) added significant value to this answer for me. – Weston Jul 04 '14 at 14:17
  • @Pryftan The question is about digraphs, not trigraphs. I was on X3J11 and was directly involved in the discussions. My statement is correct. – Jim Balter May 21 '23 at 17:40
17

I think it's because some of the keyboards on this planet might not have keys like '#' and '{'.

ChrisW
  • 54,973
  • 13
  • 116
  • 224
16

The digraphs and trigraphs in C/C++ come from the days of six bit character sets used by the CDC6000 (60 bits), Univac 1108 (36 bits), DECsystem 10 and 20 systems (36 bits) each of which used a proprietary 64 character set not compatible with the ASA X3.4-1963 (Now know as ANSI X3.4-1963 "7-bit American National Standard Code for Information Interchange"). The latest revision is ANSI X3.4-1986.

Since these systems were incapable of representing all of the 96 graphical code points, many were omitted. In addition, X3.4 was coordinated with other National Standard Institutes (GBR, GER, ITA, etc) and there were code points in X3.4 which were designated as national replacement characters - the most obvious example is the # for the Britsh Pound symbol (obvious because the name of the # character is "pound sign" from it's conventional usage in US commerce - prior to the the evolution of Twitter) and the '{' '}' were also designated as national replacement characters.

Thus digraphs were introduced to provide a mechanism for those computer systems incapable of representing the characters, and also for data terminal equipment which assigned national replacement characters to the conflicting code points. Di/Tri-graphs have become a archaic artifact of computing history (a subject not taught in computer science these days).

An exhaustive paper on this subject can be found here: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.96.678&rep=rep1&type=pdf

Martin Tournoij
  • 26,737
  • 24
  • 105
  • 146
JTM
  • 161
  • 1
  • 2
1

They were created as a simpler alternative to trigraphs according to the article on Wikipedia.

I.e., for 5 trigraphs ??(, ??), ??<, ??>, ??=, the replacing digraphs were supplied: <:, :>, <%, %>, %:. This happened in 1994.

JenyaKh
  • 2,040
  • 17
  • 25