这个表达式意味着什么,为什么要编译?

时间:2013-07-25 12:48:50

标签: c visual-c++

在拼写错误之后,编译并执行以下表达式(简化):

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 个答案:

答案 0 :(得分: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扩展名。

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

答案 1 :(得分:14)

猜猜它被解释为

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

其中NULL是一个函数指针,默认情况下返回int ...运行时实际发生的事情是依赖于平台的

答案 2 :(得分:9)

Visual Studio 2012会给您以下警告:

警告C4353:使用非标准扩展名:常量0作为函数表达式。使用'__noop'函数inner而不是

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

答案 3 :(得分:8)

实际上它是 Microsoft特定的

出于调试目的,您可以使用__noop内在函数,它指定不会评估函数和参数。

在您的情况下,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

答案 4 :(得分: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

答案 5 :(得分:0)

可能0在这里被转换为函数指针。显式演员可能如下所示:

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

但是,我没有猜测在你的例子中隐含地将0函数转换为什么。