What does this expression mean, and why does it compile? [duplicate]
After a typo, the following expression (simplified) compiled and executed:
if((1 == 2) || 0 (-4 > 2))
printf("Hello");
of course, the 0 shouldn't be there.
Why does it compile, and what does the expression mean?
The original (simplified) should look like this:
if((1 == 2) || (-4 > 2))
printf("Hello");
none of this does compile:
if((1 == 2) || true (-4 > 2))
printf("Hello");
if((1 == 2) || 1 (-4 > 2))
printf("Hello");
if((1 == 2) || null (-4 > 2))
printf("Hello");
Solution 1:
It looks like this is a Visual C++ extension to support a particular 'no function defined' idiom. From the warning C4353 page:
// C4353.cpp
// compile with: /W1
void MyPrintf(void){};
#define X 0
#if X
#define DBPRINT MyPrint
#else
#define DBPRINT 0 // C4353 expected
#endif
int main(){
DBPRINT();
}
the intention being that DBPRINT
is a no-op. The warning suggests #define DBPRINT __noop
instead, using VC's __noop extension instead.
If you view the assembly listing for your output you'll see the second clause is omitted, even in debug mode.
Solution 2:
Guess it was interpreted as
if((1 == 2) || NULL (-4 > 2))
printf("Hello");
where NULL is a function-pointer, by default returning int... What at actually happens in runtime is platform-dependent
Solution 3:
Visual Studio 2012 gives you the following warning:
warning C4353: nonstandard extension used: constant 0 as function expression. Use '__noop' function intrinsic instead
it is a non-standard way to insert a "no operation" assembler instruction at that point of expression evaluation
Solution 4:
In fact it is Microsoft specific.
For debug purpose, you can use __noop
intrinsic, it specifies that the function and the parameters will no be evaluated.
In your case, Microsoft compiler thinks you are trying to use 0 to do the same, that's why it works but for example, on VS2012 it gives the warning :
warning C4353: nonstandard extension used: constant 0 as function expression. Use '__noop' function intrinsic instead.
See this for more informations : http://msdn.microsoft.com/en-us/library/2a68558f(v=vs.71).aspx