2015-06-22 2 views
2

Следующий код предназначен для замены нескольких последовательных пробелов на 1 пробел. Хотя мне это удается, я запутался в использовании фигурных скобок.C программирование - путаница относительно фигурных скобок

Это одна на самом деле работает отлично:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
int ch, lastch; 
lastch = 'a'; 
while((ch = getchar())!= EOF) 
{ 

    if(ch == ' ') 
    { 
     if (lastch != ' ') 
     putchar(ch); 


    } 
    else 
     putchar(ch); 
     lastch = ch; 

} 
} 

Но я не могу понять, почему это не является, лишь поставив фигурные скобки во внутреннем цикле и другое заявление:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
int ch, lastch; 
lastch = 'a'; 
while((ch = getchar())!= EOF) 
{ 

    if(ch == ' ') 
    { 
     if (lastch != ' ') 
     { 
      putchar(ch); 
     } 

    } 
    else 
    { 
     putchar(ch); 
     lastch = ch; 
    } 
} 
} 

Могу ли я не заключить петлю в петлю с фигурными фигурными скобками? Я читал, что вторая - хорошая практика сделать ее читаемой, но что я делаю неправильно?

+1

В обеих ветвях 'then' и' else' оператора if содержится не более одного оператора. Итак, если вы не окружаете утверждения в фигурных скобках, тогда в ветке 'else' будет выполняться только первый' putchar() '. –

ответ

8

Единственная разница между ними - это область else. Без скобок, она охватывает до конца полного заявления, которое является следующим ;, то есть следующая строка:

else 
    putchar(ch); /* end of else */ 
lastch = ch;  /* outside of if-else */ 

С фигурными скобками, она охватывает lastch назначение слишком.

То же самое относится к заявлению if, но там у вас есть одна линия, поэтому это не имеет значения.

+0

Я чувствую себя такой тупой. Lastch = ch; должны находиться за пределами этих брекетов. Спасибо за разъяснение! – Gelo

3

Любая структура управления (if, else, for, while и т.д.) действует на блоке кода. Блоки обычно обозначаются фигурными фигурными скобками ({}), но если они опущены, то в качестве блока выступает одно заявление. Обратите внимание, что в отличие от Python, например, отступ не имеет смысла в C, это просто убеждение сделать код более читаемым.

Сказав это, давайте рассмотрим ваш else блок:

else 
    putchar(ch); 
    lastch = ch; 

Поскольку нет фигурных скобок здесь, этот блок фактически равен следующий:

else 
{ 
    putchar(ch); 
} 
lastch = ch; 

И не к блоку в вашем втором фрагменте кода. Здесь отступ lastch = ch помог нам понять код, он был путаным из-за плохого отступа, который заставлял его казаться, будто он был частью блока else, когда на самом деле это не так.

+0

Спасибо! Не понял, что lastch = ch; находится внутри этих брекетов. – Gelo

Смежные вопросы