在拼写错误之后,编译并执行以下表达式(简化):
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");
答案 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
函数转换为什么。