这是一个令人讨厌的错误,花了我半个小时来解决.编译器认为这是有效的代码,当它评估语句时,它仍然会调用foo():
if(true && false);{ foo(); }
Run Code Online (Sandbox Code Playgroud)
为什么它有效,为什么foo()仍然被调用?
Bol*_*ock 22
好吧,你没有提出问题,但我觉得有必要告诉你为什么编译器是正确的,代码是有效的(对不起,SO的人):
if (true && false);
Run Code Online (Sandbox Code Playgroud)
只是一个空语句,如果满足条件就会执行(在这种情况下,由于它没有得到满足&& false,所以没有任何反应(但无论如何都不会发生)).该语句为空,因为右括号后面紧跟分号.
{ foo(); }
Run Code Online (Sandbox Code Playgroud)
是在范围块中包含的方法调用.分号终止if条件,因此该块与if条件完全无关.它本身只是一个块.无论 if条件如何,都会执行代码.
这是有效的代码.它是一个带有空语句和范围块的if.
事实上,我的编译器会对if:可能出错的空语句发出警告
如果你写了:
if (true && false) { foo(); }
它会产生你期望的效果.
但是,如果真正的问题是为什么花了这么长时间才找到问题,那么我可以告诉你问题是你没有阅读编译器生成的警告.
这是有效的代码而不是错误.请注意;if和大括号之间的附加内容.
你的代码相当于什么
if (true && false);
//...
{ foo(); }
Run Code Online (Sandbox Code Playgroud)