[HN Gopher] What does the ??!??! operator do in C?
       ___________________________________________________________________
        
       What does the ??!??! operator do in C?
        
       Author : isomorph
       Score  : 60 points
       Date   : 2022-10-05 21:24 UTC (1 hours ago)
        
 (HTM) web link (stackoverflow.com)
 (TXT) w3m dump (stackoverflow.com)
        
       | rdlw wrote:
       | See also: "What is the "-->" operator in C++?"
       | 
       | https://stackoverflow.com/q/1642028
        
       | bradford wrote:
       | Trigraphs make this obfuscated C submission possible:
       | (https://gist.github.com/Property404/e31b99deb3527159e183)
       | 
       | I've pasted it here for convenience, but I can't make any
       | assurances about the formatting:
       | 
       | // Are you there god??/ ??=define _(please, help) ??=define
       | _____(i,m, v,e,r,y) r%:%:m ??=define ____ _____(a,f,r,a,i,d)
       | main(__)<%____(!_(-~-??-((-~-??-!__<<-
       | ??-!!__)<<-??-(!!__<<!!__))+-~-~-??--~-~
       | -~-~-~-~-??-(-~-~-~-~-??-!!__<<-~!!__),-
       | ??-!__))<%??>%>_(__,___)??<____ (printf("please let me die??/r%d
       | bottle%s" " of bee%s""""??/n",(!(___ %-~-~!!___))?--
       | __+!___++:__+!___++,!(__-!!___)
       | &&___%-~-~!!___??!??!!(___%-~-~!!___??!??!__
       | -(-~!!___))?"":"s",___%-~-??-!!___<-??-!!___? "r on the
       | wall":"eeeeeeer! Take one down,pass ??/ it
       | around")&&__&&_(__,___),"mercy I'm in pain")??<??>??>
        
       | susam wrote:
       | I learnt C from the book _The C Programming Language_ written by
       | Brian W. Kernighan and Dennis M. Ritchie, also known as K &R,
       | more than 20 years ago. I read the book almost cover to cover all
       | the way from the preface at the beginning to its three appendices
       | at the end. As someone who knew very little about computer
       | science in general and programming languages in particular back
       | then, this book was formative in my journey of becoming a
       | programmer and also picking up some computer science skills along
       | the way.
       | 
       | Appendix A (Reference Manual) of the book broadened my outlook on
       | programming languages by providing a glimpse how a programming
       | language is formally specified. Section A.12 (Preprocessing) of
       | this appendix specified trigraph sequences. Quoting from the
       | section:
       | 
       | > Preprocessing itself takes place in several logically
       | successive phases that may, in a particular implementation, be
       | condensed.
       | 
       | > 1. First, trigraph sequences as described in Par.A.12.1 are
       | replaced by their equivalents. Should the operating system
       | environment require it, newline characters are introduced between
       | the lines of the source file.
       | 
       | Then section A.12.1 (Trigraph Sequences) further elaborated
       | trigraph sequences in more detail. Quoting this section below:
       | 
       | > The character set of C source programs is contained within
       | seven-bit ASCII, but is a superset of the ISO 646-1983 Invariant
       | Code Set. In order to enable programs to be represented in the
       | reduced set, all occurrences of the following trigraph sequences
       | are replaced by the corresponding single character. This
       | replacement occurs before any other processing.
       | ??=  #       ??/  \       ??'  ^       ??(  [       ??)  ]
       | ??!  |       ??<  {       ??>  }       ??-  ~
       | 
       | > No other such replacements occur.
       | 
       | > Trigraph sequences are new with the ANSI standard.
        
       | chromatin wrote:
       | Wow, and I thought I knew C pretty well. Great post.
       | 
       | edited to add: I really like "Modern C" and just re-checked -- no
       | mention of the preprocessor feature!
       | 
       | https://hal.inria.fr/hal-02383654/file/ModernC.pdf
        
         | richbell wrote:
         | I think C also has the elusive "down to" operator.
         | 
         | https://stackoverflow.com/a/1642035
        
         | [deleted]
        
       | kenniskrag wrote:
       | trigraphs are removed in c++ 17
       | 
       | https://en.m.wikipedia.org/wiki/C%2B%2B17#Removed_features
        
         | amelius wrote:
         | I've never seen them used anywhere.
        
           | Rebelgecko wrote:
           | They're good for obfuscating source code but AFAICT that's
           | about it on modern machines
        
         | pjmlp wrote:
         | They are still around in C though.
        
           | KerrAvon wrote:
           | gone in C23
        
           | david2ndaccount wrote:
           | They are being removed in C23.
        
         | piesquaredarr wrote:
         | Huh, I never realized that C++ standards were _removing_ C
         | features. Time to be more careful about using g++ for
         | everything.
        
           | Denvercoder9 wrote:
           | C++ has never been a strict superset of C. The most obvious
           | example is the "class" and "new" keywords which can be used
           | as an identifier in C, but not in C++. There's more subtle
           | differences as well, such as character literals having type
           | int in C and char in C++.
        
           | turminal wrote:
           | Using g++ for C code is a recipe to get badly burnt - for
           | unrelated reasons. Trigraphs are disabled in gcc by default
           | anyway.
        
       ___________________________________________________________________
       (page generated 2022-10-05 23:00 UTC)