代码之家  ›  专栏  ›  技术社区  ›  Alex Yakunin

如果C中的“if”语句为空,是否会导致错误或警告?

  •  4
  • Alex Yakunin  · 技术社区  · 14 年前

    让我从现实生活中的一个例子开始:

    顾客: 亚历克斯,刚刚注意到138行的远程处理器有点奇怪:

    if (Session.Handler.ExecutePrefetchTasks()==null); 
      Session.ExecuteDelayedQueries(); 
    

    “if”后面的分号应该在那里吗?

    我: 哎呀。。。我会把这个寄给我们的人检查,但很可能你是对的。

    虽然这种情况很少见,但我承认几乎所有大型项目都有类似的问题。

    我知道C中的分号(和语句块)使用规则不能更改(我个人更喜欢Python风格)。但我认为这是个好主意 正是这个 案件与 if 语句,并将其分类为错误或警告。

    我想问几个问题:

    • 在这种情况下,为什么要生成警告或错误?

      因为这是开发人员的错误,可能有99%的概率。

    • 为什么在这种情况下错误更可取?

      在许多情况下,警告被开发人员忽略。

      我知道这是他们自己的问题 (威胁警告为错误)切换,但由于这是一个错误 可能性很高,如果不是错误(真的吗?;) 很容易解决这个问题,也许最好对这个案件进行分类 作为一个错误。

      最后,这种情况下的错误不会“限制”开发人员, 因为这样的代码可以(而且很可能必须)总是被重写 没有 如果 语句。

    • 为什么在这种情况下警告更可取?

      这不会破坏兼容性;我还怀疑某些代码生成器 可能会根据当前行为生成代码。

    所以我很高兴听到你对这件事的看法。

    2 回复  |  直到 14 年前
        1
  •  12
  •   Quintin Robinson    14 年前

    它已经发出警告:

    Possible mistaken empty statement

    我同意你的看法,错误更可取(如果你真的想要一个空语句,可以把它写为 { } 更为明确)但是他们不会以这种方式改变C语言。这将是一个突破性的变化,我怀疑他们(读:埃里克·利珀茨)的理由将是利益不超过成本。

        2
  •  0
  •   Community dbr    7 年前

    与您的例子类似,这个例子不应该产生编译错误,因为它有条件地执行逻辑的目的。

    if ( DoSomething() || SolveEquation() ) ;  // Intentional - compiles and  runs as expected.
    

    如果 if 删除关键字后,将出现编译错误。

    DoSomething() || SolveEquation();  // Compile ERROR.
    

    Short circuit logic 确定:如果dosomething()返回 true 则不计算solveEquation(),否则将计算它。

    我们假设两个函数都会以某种方式改变正在运行的程序的状态,所以执行哪个函数很重要,因为这将决定一种特定的程序状态。当然,写它的更好方法是…

    if ( ! DoSomething() )
        SolveEquation();
    

    或者(谢谢) Alex 从评论中选出)

    bool result = DoSomething() || SolveEquation(); 
    

    …但是为什么要抢走用户的第一条路呢?

    因为第一种方法可以被认为是不好的形式,但它证明您不一定希望这种情况产生编译错误。

    这是我的论点,它不应该产生编译错误 . 现有的警告很好,以防开发人员犯了一个常见的错误。