What does this expression mean, and why does it compile?

CVisual C++

C Problem Overview


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");

C Solutions


Solution 1 - C

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 - C

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 - C

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 - C

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

Solution 5 - C

In ubuntu it is showing error

int main()
{
 if((1 == 2) || 0 (-4 > 2))
      printf("Hello");
}

o/p

niew1.c:3:19: error: called object â0â is not a function

Solution 6 - C

Probably 0 is casted to a function pointer here. Explicit cast may look like this:

if((1 == 2) || ((int (*)(int)) 0) (-4 > 2)) 
      printf("Hello");

However, I have no guesses about what function 0 is casted to in implicitly in your example.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionhuebeView Question on Stackoverflow
Solution 1 - CRupView Answer on Stackoverflow
Solution 2 - CLorinczy ZsigmondView Answer on Stackoverflow
Solution 3 - CRemco BoomView Answer on Stackoverflow
Solution 4 - CPierre FourgeaudView Answer on Stackoverflow
Solution 5 - CpradiptaView Answer on Stackoverflow
Solution 6 - CIvan SmirnovView Answer on Stackoverflow