这个expression意味着什么?为什么要编译?

打字错误后,编译和执行下列expression式(简化):

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

当然,0不应该在那里。

为什么要编译,这个expression意味着什么?

原来的(简体)应该是这样的:

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

实际上它是微软的具体

为了debugging目的,你可以使用__noop内在的,它指定函数和参数将不被评估。

在你的情况下,微软编译器认为你正在试图使用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

看起来这是一个Visual C ++扩展来支持特定的“无function定义”的习惯用法。 从警告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是一个没有操作。 警告build议#define DBPRINT __noop改为使用VC的__noop扩展名。

如果查看输出的程序集列表,则会看到第二个子句被省略,即使在debugging模式下也是如此。

猜猜它被解释为

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

其中NULL是一个函数指针,默认情况下返回int …实际发生在运行时是平台相关的

Visual Studio 2012给你以下警告:

警告C4353:使用非标准扩展名:常量0作为函数expression式。 用“__noop”函数来代替

在expression式评估点插入“无操作”汇编程序指令是一种非标准的方法

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

但是,我不知道在你的例子中隐含了什么function0