c-这个表达式是什么意思,为什么要编译?

这个问题已经在这里有了答案:

  • 为什么(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");
huebe asked 2020-01-22T09:46:14Z
6个解决方案
26 votes

看起来这是一个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的__noop扩展名。

如果查看输出的程序集列表,即使在调试模式下,也会忽略第二个子句。

Rup answered 2020-01-22T09:47:21Z
14 votes

猜猜它被解释为

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

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

Lorinczy Zsigmond answered 2020-01-22T09:47:46Z
9 votes

Visual Studio 2012向您发出以下警告:

警告C4353:使用了非标准扩展名:常数0作为函数表达式。 改用'__noop'函数内在函数

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

Remco Boom answered 2020-01-22T09:48:15Z
8 votes

实际上,这是Microsoft特定的。

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

在您的情况下,Microsoft编译器认为您尝试使用0来执行相同的操作,这就是为什么它可以工作,但是例如,在VS2012上,它会给出警告:

warning C4353: nonstandard extension used: constant 0 as function expression.  Use '__noop' function intrinsic instead.

请参阅此以获取更多信息:[http://msdn.microsoft.com/zh-cn/library/2a68558f(v=vs.71).aspx]

Pierre Fourgeaud answered 2020-01-22T09:46:52Z
1 votes

在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
pradipta answered 2020-01-22T09:48:39Z
0 votes

这里可能将0强制转换为函数指针。 显式强制转换可能如下所示:

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

但是,我对您的示例中隐式转换为0的函数没有任何猜测。

Ivan Smirnov answered 2020-01-22T09:49:04Z
translate from https://stackoverflow.com:/questions/17858488/what-does-this-expression-mean-and-why-does-it-compile