Проблема понимания блоков в C - PullRequest
3 голосов
/ 07 июля 2011

Я учусь программировать на C и выполняю упражнение, которое требует от меня написать программу для печати равнобедренного треугольника.

#include <stdio.h>

int main()
{
    int col, row;

    for(col = 0; col < 6; col++)
    {
       for(row = 0; row <= col; row++)
       {
          putchar('*');
            putchar('\n');
       }
    }
}

Этот код печатает (*) на строке 21 раз. Поэтому после нескольких минут проб и ошибок я удалил внутренние скобки на внутренней петле for.

#include <stdio.h>

int main()
{
    int col, row;

    for(col = 0; col < 6; col++)
    {
       for(row = 0; row <= col; row++)
          putchar('*');
            putchar('\n');
    }
}

И я наконец достиг желаемого результата.

ТАК МОЙ ВОПРОС: Как внутренние фигурные скобки {} к внутреннему циклу for влияют на то, как выводятся результаты? И почему первый набор кода печатает * на одной строке 21 раз?

Я просмотрел свою книгу и не смог найти разумного решения, почему {} во внутреннем цикле for влияет на вывод.

Ответы [ 4 ]

7 голосов
/ 07 июля 2011

Ваш рабочий раствор эквивалентен

for(col = 0; col < 6; col++)
{
   for(row = 0; row <= col; row++)
   {
      putchar('*');
   }
   putchar('\n');
}

В Си отступ не имеет ничего общего с группировкой операторов. Брекеты групповые заявления вместе. В исходном неработающем коде фигурные скобки, следующие за внутренним циклом, заставляют весь код внутри фигурных скобок выполнять каждую итерацию цикла. В приведенном выше примере вы можете видеть, что фигурные скобки включают только соответствующие выражения для выполнения для каждой итерации цикла for.

Как могут заметить другие: отступ не говорит компилятору, что делать, но вы должны сделать отступ, чтобы визуально вы могли интерпретировать ваш код.

3 голосов
/ 07 июля 2011
Цикл

A for (или while) выполняет код между { }.

Но есть краткая форма, которая не использует { }, например:

for (i = 0; i < 10; i++)
    function();

Когда for не находит { }, он интерпретирует, что только следующий оператор будет частью тела цикла.

ЧтоВы достигли методом проб и ошибок эквивалентно:

for(col = 0; col < 6; col++) {
   for(row = 0; row <= col; row++) {
      putchar('*');
   }
   putchar('\n');
}

Обратите внимание, как putchar('\n') находится вне внутреннего цикла for.

1 голос
/ 07 июля 2011

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

for(col = 0; col < 6; col++)
{
   for(row = 0; row <= col; row++)
   {
      putchar('*');
      putchar('\n');
   }
}

и

for(col = 0; col < 6; col++)
{
   for(row = 0; row <= col; row++)
      putchar('*');
    putchar('\n');
}

Отступ используется для указания того, что последовательные строки на данном уровне отступа находятся в одном блокеобычно блок, «принадлежащий» оператору, непосредственно предшествующему блоку.Если вы хотите использовать скобки, чтобы сделать вещи еще более понятными (многие стили кодирования предлагают это), попробуйте:

for(col = 0; col < 6; col++)
{
   for(row = 0; row <= col; row++)
   {
      putchar('*');
   }
   putchar('\n');
}
0 голосов
/ 07 июля 2011

Когда вы удалили пару фигурных скобок внутреннего цикла, вы сделали область действия этого внутреннего цикла for просто единственным оператором, который печатает «*».Затем символ новой строки "\ n" печатается только один раз, а не один раз за каждый раз, когда печатается звездочка.

В фигурных скобках в C группируется "блок" операторов, чтобы они выполнялись вместе.

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