Why is (void) 0 a no operation in C and C++?

c, c++, compiler-construction

Solution

`(void)0` (+`;`) is a valid, but 'does-nothing' C++ expression, that's everything. It doesn't translate to the `no-op` instruction of the target architecture, it's just an empty statement as placeholder whenever the language expects a complete statement (for example as target for a jump label, or in the body of an `if` clause).

From Chris Lutz's comment:

It should be noted that, when used as a macro (say, `#define noop ((void)0)`), the `(void)` prevents it from being accidentally used as a value (like in `int x = noop;`).

For the above expression the compiler will rightly flag it as an invalid operation. GCC spits `error: void value not ignored as it ought to be` and VC++ barks `'void' illegal with all types`.

Problem

I have seen debug printfs in glibc which internally is defined as `(void) 0`, if NDEBUG is defined. Likewise the `__noop` for Visual C++ compiler is there too. The former works on both GCC and VC++ compilers, while the latter only on VC++. Now we all know that both the above statements will be treated as no operation and no respective code will be generated; but here's where I've a doubt. In case of `__noop`, MSDN says that it's a intrinsic function provided by the compiler. Coming to `(void) 0` ~ Why is it interpreted by the compilers as no op? Is it a tricky usage of the C language or does the standard say something about it explicity? Or even that is something to do with the compiler implementation?

Original source