Каковы точные эффекты брекетов в этом для-l oop? - PullRequest
0 голосов
/ 05 апреля 2020

У меня вопрос по поводу для l oop: этот код должен добавить 6 случайных чисел в 3 разных поля. Этот код вместо этого помещает 21 число в каждое поле (* 1). Я мог бы решить эту проблему, либо сняв скобки со второго for-l oop (* 2), либо написав [i, k] = r.Next (20, 31); перед брекетами (* 3). Но почему?

1

        int[,] a;
        a = new int[7, 3];

        listeBox.Items.Clear();
        listBox1.Items.Clear();
        listBox2.Items.Clear();

        for (int i = 0; i <= a.GetUpperBound(0); i++)    //false
        {

            for (int k = 0; k <= a.GetUpperBound(1); k++) 

            {
                a[i, k] = r.Next(20, 31); 
                listeBox.Items.Add(a[i, 0]);
                listBox1.Items.Add(a[i, 1]);
                listBox2.Items.Add(a[i, 2]);
            }   

        }

2

                for (int k = 0; k <= a.GetUpperBound(1); k++) //correct


                a[i, k] = r.Next(20, 31); 
                listeBox.Items.Add(a[i, 0]);
                listBox1.Items.Add(a[i, 1]);
                listBox2.Items.Add(a[i, 2]);

3

             for (int k = 0; k <= a.GetUpperBound(1); k++) //correct

              a[i, k] = r.Next(20, 31); 

            {
                listeBox.Items.Add(a[i, 0]);
                listBox1.Items.Add(a[i, 1]);
                listBox2.Items.Add(a[i, 2]);
            }   

1 Ответ

0 голосов
/ 05 апреля 2020

Это работает, потому что, кроме строки a[i,k] = r.Next(20,31), ни одна из других строк внутри вашего блока не использует k ни для чего. В первом примере

for (int k = 0; k <= a.GetUpperBound(1); k++) 
{     
    a[i, k] = r.Next(20, 31); 
    listeBox.Items.Add(a[i, 0]);
    listBox1.Items.Add(a[i, 1]);
    listBox2.Items.Add(a[i, 2]);    
}   

Строки listBox... каждый раз делают одно и то же через k l oop, так что вам не нужно делать одно и то же снова и снова.

Во втором примере отсутствие скобок означает, что l oop выполняет только строку

a[i, k] = r.Next(20, 31); 

Это то же самое, что сказать

for (int k = 0; k <= a.GetUpperBound(1); k++) //correct
    a[i, k] = r.Next(20, 31); 

listeBox.Items.Add(a[i, 0]);
listBox1.Items.Add(a[i, 1]);
listBox2.Items.Add(a[i, 2]);

Когда k l oop завершен, он переходит к коду listBox.Items.Add(...).

В третьем примере фигурные скобки не привязаны к l oop, поэтому вы создаете блок без какой-либо управляющей структуры. Он функционально идентичен вашему второму примеру. Это может быть полезно для создания блоков таким образом при многих обстоятельствах, но, в вашем случае, это ничего не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...