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

时间:2011-05-13 10:55:36

标签: c# .net

这是一个令人讨厌的错误,花了我半个小时来解决。编译器认为这是有效的代码,当它评估语句时,它仍然会调用foo():

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

为什么它有效,为什么foo()仍然被调用?

8 个答案:

答案 0 :(得分:22)

好吧,你没有提出问题,但我觉得有必要告诉你为什么编译器是正确的,代码是有效的(对不起,SO的人):

if (true && false);

只是满足条件时执行的空语句(在这种情况下由于&& false而无法满足它,所以没有任何反应(但无论如何都不会发生))。该语句为空,因为右括号后面紧跟分号。

{ foo(); }

是否在范围块中包含方法调用。 分号终止if条件,因此该块与if条件无关。它本身只是一个块。代码执行,无论是否为条件。

答案 1 :(得分:8)

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

实际上我的编译器会对if:可能错误的空语句

发出警告

如果你写了:

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

它会产生你期望的效果。

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

答案 2 :(得分:5)

这是有效的代码,而不是错误。请注意if和大括号之间的额外;

您的代码相当于

if (true && false);

//...

{ foo(); }

答案 3 :(得分:2)

删除之间的分号)和{

答案 4 :(得分:2)

if (true && false) {

foo();

}

我认为这就是你想要的。

如果你这样做

if(true && false);

它将停止你的if语句;所以下面的代码都是:

foo();

已执行。

答案 5 :(得分:1)

if(true && false);

;(分号)打破if循环并转到foo();

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

答案 6 :(得分:1)

您可以声称规范是愚蠢的,但您不能声称它是编译器中的错误。我认为将;直接写为if是非法的,因为我认为没有哪种情况有用。

因为你甚至得到了编译器警告,所以在实践中这不应该是一个大问题。

答案 7 :(得分:-1)

正确答案has already been given,和 这不是一个额外的答案,但无论如何都值得指出:使用jslint你可以避免这个问题。

例如,这是emacs中的一个Javascript缓冲区,其中包含flymake-for-javascript - emacs'即时语法检查程序 - 已启用:

enter image description here

(ps:该图片也使用flymake-cursor.el,以自动显示下面的错误消息)

JSLint可以从命令行运行,可以包含在自动构建过程中,也可以集成到开发工具中。如果您还没有检查过,请执行此操作。你将学习一些Javascript编码的好习惯。