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

本文关键字:不需要 循环 For 静态方法 | 更新日期: 2023-09-27 18:30:13

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 循环不需要 {}?当我把大括号放进去时,会出现"检测到无法访问的代码"和"并非所有代码路径都返回值"的编译时错误。 它与返回函数有关吗?

提前感谢!

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

为什么 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();

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

基本上:

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

相当于:

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

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

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

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

在这种情况下,不能保证 for 循环会运行(例如i < grages.Length可能不是真的(,所以你得到错误。相反,您应该将 return 语句移到循环之外。

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

此代码:

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

等效于此代码:

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

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

附带说明一下,使用大括号总是比不使用大括号更清楚。

有一个不带括号的 for 循环意味着你将只在下一个语句上应用"循环">

所以

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

相当于

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

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

仅当您要在循环中

放置多个语句时,循环中代码两边的大括号才是必需的。如果没有大括号,则只有 for 子句后面的语句是循环的一部分。

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

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

如果改为在循环中包含 return 语句,则只有在执行循环中的代码时才会执行该语句,因此您会收到一个编译器错误,告诉您保证执行 return 语句。

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

这意味着启动 for 循环后的下一行是 for 循环中包含的唯一语句。

如果在 return 语句

两边加上大括号,则在将 return 语句作为 for 循环的一部分包含在内时,将收到编译错误。

同样,如果您希望作为编程美学,则可以在单个目标语句周围包含大括号,但除非您要包含在循环中多个语句,否则这不是必需的。

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