对于静态方法中的循环不需要{}

时间:2014-11-12 17:44:09

标签: c#

using System; 

class FirstArray
{
    static void Main()
    {
        int numOfGrades;
        double[] listOfGrades;
        Console.Write("How many students in the class? ");
        numOfGrades = int.Parse(Console.ReadLine());
        listOfGrades = new double[numOfGrades];                
        ReadGrades(listOfGrades);
        double sumGrades = GetGradesSum(listOfGrades);                      
        Console.WriteLine("\n\nClass statistics\n--------------------");
        Console.WriteLine("Grades sum = {0:F2}", sumGrades);
    }

    static void ReadGrades(double[] grades)
    {
        for(int i = 0; i < grades.Length; i++)
        {
            Console.Write("Enter the grade of student {0}:", i + 1);
            grades[i] = double.Parse(Console.ReadLine());   
        }        
    }

    static double GetGradesSum(double[] grades)
    {
        double sum = 0;         
        for(int i = 0; i < grades.Length; i++)
            sum += grades[i];           
            return sum;
    }
}

大家好,

为什么GetGradeSum方法中的for循环不需要{}?当我把括号插入时,会发现编译时错误,并且检测到无法访问的代码&#34;并且&#34;并非所有代码路径都返回一个值。它与返回函数有关吗?

提前致谢!

7 个答案:

答案 0 :(得分:4)

  

为什么GetGradeSum方法中的for循环不需要{}?

因为它的身体是一个单一的陈述。如果你正确缩进代码,理解起来要简单得多。您当前的代码更清楚地写为:

static double GetGradesSum(double[] grades)
{
    double sum = 0;

    for(int i = 0; i < grades.Length; i++)
        sum += grades[i];

    return sum;
}

请注意return语句不是循环的一部分。如果是,它将返回第一个等级,而不是总和。

所以带括号的等效代码是:

static double GetGradesSum(double[] grades)
{
    double sum = 0;

    for(int i = 0; i < grades.Length; i++)
    {
        sum += grades[i];
    }
    return sum;
}

听起来你试图在两个语句周围加上大括号,所以:

// Broken
static double GetGradesSum(double[] grades)
{
    double sum = 0;

    for(int i = 0; i < grades.Length; i++)
    {
        sum += grades[i];
        return sum;
    }
}

此时,编译器抱怨因为完全有可能在没有返回任何内容的情况下到达方法的末尾 - 如果grades的长度为0,我们将永远不会进入循环体,所以永远不会回来。

请注意,无论如何,LINQ使所有这些无关紧要,请注意 - 您只需写下:

using System.Linq;
...

double sumGrades = listOfGrades.Sum();

答案 1 :(得分:1)

如果你不写大括号{},那么只有for (...)之后的行在循环内执行。

基本上:

for (...)
    A();
    B();

相当于:

for (...)
{
    A();
}

B();

这也回答了你的第二个问题,因为return语句将在循环内(假设你把}放在它之后)。

答案 2 :(得分:0)

如果循环体只包含一个语句,则可以省略大括号。但如果你这样做:

for(int i = 0; i < grades.Length; i++)
{
     sum += grades[i];
     return sum;
}

在这种情况下,无法保证for循环将运行(例如i < grages.Length可能不正确),因此您得到错误。相反,您应该将循环语句移到循环之外。

答案 3 :(得分:0)

当只有一个语句要执行时,不需要大括号。

此代码:

for(int i = 0; i < grades.Length; i++)
    sum += grades[i];

等同于此代码:

for(int i = 0; i < grades.Length; i++)
{
    sum += grades[i]
}

如果要执行多个语句,则需要大括号。

另一方面,使用大括号总是比不使用。

答案 4 :(得分:0)

使用不带括号的for循环意味着您将应用“循环”#39;仅在下一个声明中

所以

for(int i = 0; i < grades.Length; i++)
        sum += grades[i];

相当于

for(int i = 0; i < grades.Length; i++)
        {
            sum += grades[i];
        }

答案 5 :(得分:0)

方法中的缩进有点令人困惑,因为它可能会让您认为return语句是循环的一部分。

如果要在循环中放置多个语句,则循环中代码周围的大括号是必需的。如果你没有大括号,那么只有for子句后面的语句才是循环的一部分。

如果为循环添加大括号,它们应该只在循环后的语句周围:

static double GetGradesSum(double[] grades)
{
    double sum = 0;

    for(int i = 0; i < grades.Length; i++)
    {
        sum += grades[i];
    }
    return sum;

}

如果您在循环中包含return语句,那么只有在循环内的代码被执行时才会执行它,因此您会收到编译器错误,告诉您它保证{{1}语句被执行。

答案 6 :(得分:0)

很简单,这里的所有答案都是准确的。在大多数并行C的语言中, 如果您要定位单个语句,则不需要花括号

在启动for循环后,意味着VERY NEXT LINE是for循环中包含的唯一语句。

如果你在返回语句周围加上大括号,你将收到编译错误,因为你将return语句作为for循环的一部分包含在内。

同样,如果你喜欢编程美学,你可以在单一目标语句中包括大括号,但除非你想要在循环中包含多个语句,否则它不是必需的。

这个原则与if / else语句相同。