为什么在最里面的for循环中添加大括号会产生如此奇怪的结果?

时间:2014-08-29 20:35:54

标签: c#

这是一个稍微修改过的答案,我在前面提到的问题。当发生奇怪的事情时,我会改变它以更好地理解它。

对于C#中的循环应该以这种方式工作:

for (initial increment value, end increment value, increment rate)
{
    // for loop body
}

我得到的答案代码似乎有效,但是在内部循环中没有括号。这是代码:

using System;

class Prime_Screening
{
    static void Main()
    {
        Console.WriteLine("Prime numbers x, where: 0 < x < 100");
        bool prime;

        for (int num = 2; num <= 100; num++)
        {
            prime = true; /


            for (int div = 2; div <= Math.Sqrt(num); div++)
            // Why isn't the contents of this for loop in braces? Attempting it produces a weird output
                if(num % div == 0) 
                    prime = false;
                if (prime) 
                    Console.Write(num.ToString() + ", ");
        }
    } 
}

我在for循环中添加了大括号,以便我可以保持代码清晰,但是我得到了一些奇怪的重复输出:

5,7,9,11,11,13,13,15,17,17,17,19,19,19,21,23,23,23,25,25,25,27,29,29 ,29,29,31 ... 93,95,95,95,97,97,97,97,97,97,97,97,99,

为什么呢?虽然我们关注这个问题,但是,如果陈述也是括号吗?

编辑:拼写/语法

4 个答案:

答案 0 :(得分:4)

您不需要使用大括号,但只有第一个语句属于循环。

由于此处不是if-else而是if只有第一个属于循环:

for (int div = 2; div <= Math.Sqrt(num); div++)
    if (num % div == 0)
        prime = false;
    if (prime)
        Console.Write(num.ToString() + ", ");

与以下内容相同:

for (int div = 2; div <= Math.Sqrt(num); div++)
{
    if (num % div == 0)
        prime = false;
}
if (prime)
    Console.Write(num.ToString() + ", ");

而不是这两个属于循环的代码:

for (int div = 2; div <= Math.Sqrt(num); div++)
{
    if (num % div == 0)
        prime = false;
    if (prime)
        Console.Write(num.ToString() + ", ");
}

来自msdn:for-loop

  

循环体包含一个语句,一个空语句或一个   通过封闭零或更多来创建的语句块   大括号中的陈述。

答案 1 :(得分:3)

你得到奇怪结果的原因是因为未支持的陈述仅适用于下一个陈述

这是没有大括号编译的内容:

for (int div = 2; div <= Math.Sqrt(num); div++)
{
    // Why isn't the contents of this for loop in braces? Attempting it produces a weird output
    if(num % div == 0) 
        prime = false;
}

if (prime) 
     Console.Write(num.ToString() + ", ");

答案 2 :(得分:3)

for循环不需要跟一个语句块(用大括号包裹一些语句),它只需要后跟一个语句。语句块只是将一些语句转换为单个(复杂)语句的一种方式。

内部for循环后面的语句是:

if(num % div == 0) 
    prime = false;

如果你用括号包裹它,它不会改变代码。如果你在括号中包含了那个和下面的语句(第二个if块)(如你的缩进似乎表明的那样),那么你将改变代码的语义。

同样的行为也适用于ifwhileforeachdo等结构,尽管interestingly enough not try/catch/finally blocks

答案 3 :(得分:0)

当我们有多个语句放入代码块时,我们使用大括号。它可以是for loop while loop if else等。

但是当我们只有一个语句时,我们不使用大括号。当我们不使用大括号时,会在循环中考虑下一个语句。

在您的情况下,您必须将两个if条件放在大括号中,否则它将只考虑循环中的第一个if条件。