Что означает это выражение и почему оно компилируется?

После опечатки скомпилировано и выполнено следующее выражение (упрощенное):

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

конечно, 0 не должно быть.

Почему он компилируется и что означает выражение?

Оригинал (упрощенный) должен выглядеть следующим образом:

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

ничего из этого не компилируется:

if((1 == 2) || true (-4 > 2))
  printf("Hello");

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

if((1 == 2) || null (-4 > 2))
  printf("Hello");

Ответ 1

Фактически это Microsoft.

В целях отладки вы можете использовать __noop intrinsic, он указывает, что функция и параметры не будут оцениваться.

В вашем случае компилятор Microsoft считает, что вы пытаетесь использовать 0, чтобы сделать то же самое, почему он работает, но, например, на VS2012 он дает предупреждение:

warning C4353: nonstandard extension used: constant 0 as function expression.  Use '__noop' function intrinsic instead.

Смотрите это для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/2a68558f(v=vs.71).aspx

Ответ 2

Похоже, это расширение Visual С++ для поддержки определенной идиомы без функции. На странице предупреждение C4353:

// 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();
}

предполагается, что DBPRINT - это не-op. Предупреждение предлагает вместо #define DBPRINT __noop вместо этого использовать расширение VC __ noop.

Если вы просмотрите список сборки для вашего вывода, вы увидите, что второе предложение опущено даже в режиме отладки.

Ответ 3

Предположим, что это было интерпретировано как

if((1 == 2) || NULL (-4 > 2))
  printf("Hello");

где NULL является указателем на функцию, по умолчанию возвращает int... То, что на самом деле происходит во время выполнения, зависит от платформы

Ответ 4

Visual Studio 2012 дает следующее предупреждение:

предупреждение C4353: нестандартное расширение используется: константа 0 как выражение функции. Вместо этого используйте функцию "__noop"

это нестандартный способ вставить инструкцию ассемблера "нет операции" в этой точке оценки выражения

Ответ 5

В ubuntu отображается ошибка

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

о/р

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

Ответ 6

Вероятно, 0 приводится к указателю функции здесь. Явный прилив может выглядеть следующим образом:

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

Однако у меня нет никаких догадок о том, какая функция 0 выполняется неявно в вашем примере.