为什么if(true && false); {foo(); 有效吗?

All*_*lan 3 .net c#

这是一个令人讨厌的错误,花了我半个小时来解决.编译器认为这是有效的代码,当它评估语句时,它仍然会调用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`语句之后的分号**(`;`),而不是你把'true`和`false`结合起来的事实. (6认同)

Vin*_*vic 8

这是有效的代码.它是一个带有空语句和范围块的if.

事实上,我的编译器会对if:可能出错的空语句发出警告

如果你写了:

if (true && false) { foo(); }

它会产生你期望的效果.

但是,如果真正的问题是为什么花了这么长时间才找到问题,那么我可以告诉你问题是你没有阅读编译器生成的警告.


Sir*_*ver 5

这是有效的代码而不是错误.请注意;if和大括号之间的附加内容.

你的代码相当于什么

if (true && false);

//...

{ foo(); }
Run Code Online (Sandbox Code Playgroud)