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


этот вопрос уже есть ответ здесь:

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

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

6 ответов:

На самом деле это Microsoft specific.

для отладки цели, вы можете использовать __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=против 71). aspx

похоже, что это расширение Visual C++ для поддержки определенной идиомы "без определенной функции". Из предупреждение 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 нет. Предупреждение предполагает #define DBPRINT __noop вместо этого, используя VC __Нооп.

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

думаю, это было истолковано как

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

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

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

предупреждение C4353: используется нестандартное расширение: константа 0 в качестве выражения функции. Используйте функцию' __noop ' intrinsic вместо

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

в ubuntu он показывает ошибку

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

o / p

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

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

if((1 == 2) || ((int (*)(int)) 0) (-4 > 2)) 
      printf("Hello");
, у меня нет догадок о том, что функция 0 приводится к In неявно в вашем примере.