Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Wiki Markup
Two consecutive question marks signify the start of a trigraph sequence.
Wiki Markup
 According to the C99 Standard \[[ISO/IEC 9899:1999|AA. C References#ISO/IEC 9899-1999]\]:

All occurrences in a source file of the following sequences of three characters (that is, trigraph sequences) are replaced with the corresponding single character.

??=

#

 

??)

]

 

??!

|

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="8c9024a1826360e2-4c6b6ef0-4b2e470c-987780d0-e36d40202e2b284240c74ee2"><ac:plain-text-body><![CDATA[

??(

[

 

??'

^

 

??>

}

]]></ac:plain-text-body></ac:structured-macro>

??/

\

 

??<

{

 

??-

~

...

The following compliant solution eliminates the accidental introduction of the trigraph by separating the ?'squestion marks.

Code Block
bgColorccccff
// what is the value of a now? ?/
a++;

...

Code Block
bgColor#ffcccc
size_t i;
 = /* assignmentsome ofinitial ivalue */;
if (i > 9000) {
   if (puts("Over 9000!??!") == EOF) {
     /* Handle Error */
   }
}

This example prints Over 9000!| if a C99-compliant compiler is used.

Compliant Solution

The This compliant solution uses string concatenation to concatenate the two question marks; otherwise they are interpreted as beginning a trigraph sequence.

Code Block
bgColorccccff
size_t i = /* some initial value */;
/* assignment of i */
if (i > 9000) {
   if (puts("Over 9000!?""?!") == EOF) {
     /* Handle Error */
   }
}

...

Inadvertent trigraphs can result in unexpected behavior. Some compilers provide options to warn when trigraphs are encountered , or to disable trigraph expansion. Use the warning options and ensure your code compiles cleanly (see MSC00-C. Compile cleanly at high warning levels).

...