【问题标题】:Using for loop and if statement side by side C++并排使用 for 循环和 if 语句 C++
【发布时间】:2018-05-20 20:29:47
【问题描述】:

有人可以解释这种并排使用 for 和 if 的语法吗?

int min_dist = huge;
int v = -1;

for (int i = 0; i < N; ++i) if (!done[i]) {
    if (d[i] >= min_dist) continue;
    min_dist = d[i];
    v = i;
} 

【问题讨论】:

  • side by side 是什么意思?
  • 这只是 for 循环中的 if 语句。你到底没有得到什么?在“if”之前添加一个换行符,它的作用完全相同,但更具可读性。如果您想让它更清晰,请添加花括号。
  • if 不必在下一行,在大多数情况下,您输入多少空格(包括新行)取决于您。
  • 这可能不是最直观的编写方式,但它只是一个循环,其中仅包含一个 if() 语句作为其主体。所以程序员很聪明,省略了循环体的大括号。
  • 不要这样写代码。

标签: c++ for-loop if-statement syntax


【解决方案1】:

它不是并排的。这是for 内的iffor 的语法是

for(...)
  statement

碰巧if 也是一个声明。所以你的代码相当于这个:

for(...)
  if() {
  }

因为编译过程几乎忽略了空格。有没有新线都没关系。它仍然是一个声明。就像单线没有关系一样

if (d[i] >= min_dist) continue;

如果我们不省略那些明显关键的大括号:

for(...) {
  if() {
  }
}

以后我们不太可能感到困惑。

【讨论】:

  • 而且(我认为与 OP 相关);和for(...) if (...)在一行上是一样的。
【解决方案2】:

这是一种缩进和组织不佳的代码。相当于:

for (int i = 0; i < N; ++i)
{  
  if (!done[i])
  {
    if (d[i] >= min_dist) continue;
    min_dist = d[i];
    v = i;
  }
} 

for 行之后添加块{} 使其更易于阅读。

您可以为第二个if 语句添加另一个块以使其更容易。

for (int i = 0; i < N; ++i)
{
  if (!done[i])
  {
    if (d[i] >= min_dist)
    {
      continue;
    }

    min_dist = d[i];
    v = i;
  }
} 

您可以将其简化为:

for (int i = 0; i < N; ++i)
{
  if (!done[i])
  {
    if (d[i] < min_dist)
    {
      min_dist = d[i];
      v = i;
    }
  }
} 

两个ifs 可以组合起来更简单。

for (int i = 0; i < N; ++i)
{
  if (!done[i] && d[i] < min_dist)
  {
    min_dist = d[i];
    v = i;
  }
} 

【讨论】:

    【解决方案3】:

    这完全一样:

    int min_dist = huge;
    int v = -1;
    
    for (int i = 0; i < N; ++i){
        if (!done[i]) {
            if (d[i] >= min_dist) continue;
            min_dist = d[i];
            v = i;
        }
    }
    

    作为解释,当你在 for 或 if 中只有一个语句时,你不需要括号。

    【讨论】:

    • 你不需要它们;不。但是您仍然应该将它们放入(恕我直言),因为它们对您的代码的普通读者非常有帮助 - 可能是不熟悉 C++ 语法细节的新手。为读者编写代码,而不是为编译器编写代码(如果有效,编译器会自行计算)。
    • @JesperJuhl 我同意你的观点,括号确实区分了范围,但很高兴知道它们并不总是必要的,因为你可能会遇到其他代码。
    【解决方案4】:

    布局可能会欺骗您。这只是一个带有单个 if 语句的 for 循环:

    • 对于由 i 索引的每个项目
    • 如果项目 i 尚未完成,则在 if-body 中处理项目 i
    • else 下一项(在 for 循环中)

    【讨论】:

      【解决方案5】:

      我总是在看代码时发现我不明白最好的方法是以我觉得更容易阅读的格式重写它,在这种情况下:

      for (int i = 0; i < N; ++i) {
          if (!done[i]) {
              if (d[i] >= min_dist) {
                  continue;
              }
              min_dist = d[i];
              v = i;
          }
      }
      

      if 语句在循环旁边的事实仅意味着这是要解析为循环体的表达式(注意总是如此,也使用块 {})。这个if 也有一个主体,通过明确地放入省略的块,更容易看到发生了什么。

      【讨论】:

        【解决方案6】:

        如果您打算使用不带括号的循环,则可以使用它来执行单个语句块。在这种情况下,ifstatement 将所有其他语句组合在一对括号中,使它们成为一个块。

        【讨论】:

          【解决方案7】:

          编写此代码的正确方法如下:

          for (int i  0; i < N; ++i)
              if (!done[i] && d[i] < min_dist) {
                  min_dist = d[i];
                  v = i;
              }
          

          iffor 放在同一行只会让事情变得混乱。就像有两个 if 语句而不是一个。

          【讨论】:

          • 为了更加清晰;为 for 循环添加大括号。
          • @JesperJuhl -- 为了额外的混乱,在 for 循环中也添加大括号。 说真的:这更多是个人风格问题。在我的代码中,我没有添加多余的大括号。
          • 我同意这是一个风格问题。但我个人的经验是,如果你总是加上牙套,新手就会不那么困惑。我自己发现不熟悉的代码这样更容易阅读。所以我(个人)认为你应该总是只添加大括号 - 是否需要。但;这是一个品味问题..
          猜你喜欢
          • 2013-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-28
          • 2019-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多