Yes to both, in both the source and execution character set.
In the official printed C89 document, section 2.2.1,
the bar shown is the solid bar, not the broken bar. The bar
is also trigraphed as ??!
But it doesn't require that they must *look* that way.
C99 rationale:
5.2.1 Character sets
The C89 Committee ultimately came to remarkable unanimity on the subject of character set
20 requirements. There was strong sentiment that C should not be tied to ASCII, despite its heritage
and despite the precedent of Ada being defined in terms of ASCII. Rather, an implementation is
required to provide a unique character code for each of the printable graphics used by C, and for
each of the control codes representable by an escape sequence. (No particular graphic
representation for any character is prescribed; thus the common Japanese practice of using the
25 glyph “¥†for the C character “\†is perfectly legitimate.) Translation and execution
environments may have different character sets, but each must meet this requirement in its own
way. The goal is to ensure that a conforming implementation can translate a C translator written
in C.
5.2.1.1 Trigraph sequences
[snip]
The characters in the ASCII repertoire used by C and absent from
the ISO/IEC 646 invariant
repertoire are:
#[]{}\|~^
Given this repertoire, the C89 Committee faced the problem of defining
representations for the
5 absent characters. The obvious idea of defining two-character escape
sequences fails because C
uses all the characters which are in the ISO/IEC 646 repertoire, so no
single escape character is available. The best that can be done is to
use a trigraph: an escape digraph followed by a distinguishing
character.
MSE.4 Support for invariant ISO/IEC 646
[snip]
ISO/IEC 646, the international standard corresponding to ASCII,
permits national variants of a
number of the characters used by C. Strictly speaking, this is not a
problem in representing C programs, since the necessary characters
exist in all such variants: they just print oddly.
10 Displaying C programs for human edification suffers, however, since the
operators and
punctuators can be hard to recognize in their various altered forms.
C90 addresses the problem in a different way. It provides replacements
at the level of individual characters using three-character sequences
called trigraphs (see §5.2.1.1). For example, ??< is entirely
equivalent to {, even within a character constant or string literal.
While this approach
15 provides a solution for the known limitations of EBCDIC (except for the
exclamation mark) and
ISO/IEC 646, the result is arguably not highly readable.