2013-07-25 136 views
51

一个错字后,下面的表达式(简化的)编译和执行:这个表达式是什么意思,它为什么编译?

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

我刚刚试过这个,并得到[警告C4353](http://msdn.microsoft.com/en-us/library/2a68558f.aspx):“使用非标准扩展名:常量0作为函数表达式。 '__noop'函数内在的相反“ – Rup

+3

我得到了'错误:调用对象'0'不是一个函数' –

+3

这已经被回答了http://stackoverflow.com/questions/2198950/why-is-void-0-a-no-operation-in-c-and-c –

回答

8

其实它是微软具体

出于调试目的,您可以使用__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

+0

重要的是,参数也不会被评估。 – huebe

+0

这种noop-ed函数返回什么? if((1 == 2)|| 0(-4> 2))'请求布尔值。这是一个来自注册表的随机数吗? – Kane

14

猜猜它被解释为

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

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

+0

类型安全的重要性... C++ 11使事情更多通过引入另一种类型的NULL值来保护这类问题 –

1

在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

大概0浇铸到一个函数指针这里。显式类型转换可能看起来像这样:

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

不过,我没有猜测什么功能0是在你的例子在铸造含蓄。

9

的Visual Studio 2012为您提供了以下警告:

警告C4353:非标准扩展使用:常数0作为函数表达式。使用“__noop”功能特性,而不是

它是插入一个“不操作”汇编在表达式求值的那点指令

26

看起来这是一个Visual C++的扩展,以支持特定的非标准方式'没有功能定义'的成语。从warning 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的__noop扩展。

如果您查看输出的汇编列表,您会看到第二个子句被省略,即使在调试模式下。

相关问题