2013-07-25 58 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擴展。

如果您查看輸出的彙編列表,您會看到第二個子句被省略,即使在調試模式下。

相關問題