Это работает, потому что, кроме строки 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, поэтому вы создаете блок без какой-либо управляющей структуры. Он функционально идентичен вашему второму примеру. Это может быть полезно для создания блоков таким образом при многих обстоятельствах, но, в вашем случае, это ничего не делает.