Что означает это выражение и почему оно компилируется?
После опечатки скомпилировано и выполнено следующее выражение (упрощенное):
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
выполняется неявно в вашем примере.