【问题标题】:C# Iteration I have Never Seen Before [duplicate]我以前从未见过的 C# 迭代 [重复]
【发布时间】:2021-09-15 21:38:01
【问题描述】:

我在 HackerRank 上练习编码,但遇到了其中一个问题。我查看了其他人的处理方式,发现了一些我以前从未见过的东西。

public static int jumpingOnClouds(List<int> c)
{
        int count = 0;

        for (int i = 0; i < c.Count - 1; i++) 
        {
            if (c[i] == 0) 
                 i++;

            count++;
        }
        
        return count;
}

这个迭代应该通过一个整数数组。如果整数为 0,则需要一步,如果为 1,则不执行任何操作。在“if”语句中:

    if (c[i] == 0) 
        i++;
    count++;
    

这段代码有效。但是我尝试像这样重写它:

if (c[i] == 0) 
{
    i++;
    count++;
}

但它不像之前的代码那样工作。有人可以帮忙解释一下这个人做了什么,因为我不知道去哪里看或者这甚至叫什么?

【问题讨论】:

  • 您对这段代码的作用和实际作用的描述并不准确
  • 抱歉,这里有什么问题?如果您想知道为什么添加 {} 后代码不起作用,那是因为在原始代码中作者使用了单行 if,所以它等效于 if (c[i] == 0) { i++; } count++;
  • 当你不使用括号时,解释取决于你如何缩进你的行。这正是我总是使用括号的原因;这种语法是灾难的根源。
  • 浏览代码的作用。一旦你弄清楚了,就承诺永远不要使用这样的聪明黑客。假设列表包含 5 个整数,索引 1 和 3 为零(因此索引 0、2 和 4 非零)。在 i==zero 上,它是非零的,所以它会跳过 if 块,count 会增加。在 i==1 时,该值为零,因此 i 和 count 都将递增。下一次迭代将有 i==3(不是 2),这会混淆一切。这意味着将忽略索引 2 处的值。剩下的就交给你了
  • @obsidan:不!在 C# 中,在确定块结构时完全忽略缩进(与 Python 不同)。在if(或for,或...)之后,一个语句或大括号分隔的块被视为if(等)的目标

标签: c#


【解决方案1】:

如果ifwhilefor 没有括号{ },它将运行第一行,然后存在于语句之外。

这个:

if (c[i] == 0) 
    i++;
count++;

其实是这个意思:

if (c[i] == 0) 
{
    i++;
}

count++;

没有括号的语句称为嵌入式语句。它与为 if 语句创建的新范围几乎相同,但存在差异。

  • 只运行它到达的第一行/功能。
  • 您不能在 Embedded 语句中定义变量。
  • 未创建新范围。

【讨论】:

  • 感谢您的回答。我误读了它,没有意识到 count 正在迭代每个循环,而“i”仅在 c[i] == 0 时被迭代。
猜你喜欢
  • 2014-04-06
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多