Что означает это выражение и почему оно компилируется? [дубликат]
этот вопрос уже есть ответ здесь:
- почему (void) 0 не работает в C и c++? 5 ответов
после опечатки компилируется и выполняется следующее выражение (упрощенное):
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 ответов:
На самом деле это 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 " в эту точку вычисления выражения