The other languages can be written by a parser. A parser for C needs a semantic analyzer working in tandem.
The C preprocessor is not text substitution.
It is not easy to describe what C does at a low level. There are simple, easy to describe and wrong models of what C does "at a low level". C's semantics are defined by a very difficult to understand standards document, and if you use one of those simple and enticing mental models, you will end up with incorrect C code which works until you try a different compiler or enable optimisations.
A parser for C does not need a semantic analyzer. What C does it allows semantic analysis to be integrated into the parser.
The preprocessor has some weird behavior, it it is also not very complicated.
And I would argue that the abstract machine model of C is still relatively simple. There are are certainly simpler languages in this regard, but they give up one of the key powers of C, i.e. that you can manipulate the representation of objects on a byte level.
By that argument the other languages mentioned are impossible to understand since they don't have a spec, except for Go again.
No. The other languages have documented semantics too. Just happens that C's are in the shape of a standards document.