используя ключевое слово goto в C

# include <stdio.h>

int main()
{
  int a=5;
  begin:
  if(a)
       printf("%d\n",a);
   a--;
   goto begin;
   return 0;
 }

Когда a становится 0, тогда, если условие не будет выполнено, то почему вывод будет бесконечным в этом коде означает

выход -

 5
 4
 3
 2
 1
 0
-1
-2
and so on endless

person Aman Singh    schedule 13.07.2013    source источник
comment
в чем именно ваш вопрос?   -  person Winks    schedule 13.07.2013
comment
Почему условие if выполняется, даже когда a становится 0   -  person Aman Singh    schedule 13.07.2013
comment
Я не думаю, что вы скопировали свой код точно в том виде, в котором вы его скомпилировали.   -  person PP.    schedule 13.07.2013
comment
if не срабатывает, когда i для меня равно 0...   -  person Kninnug    schedule 13.07.2013
comment
@PP тот же приятель, я получаю бесконечный вывод для одного и того же кода, вы можете проверить это   -  person Aman Singh    schedule 13.07.2013
comment
Код работает так, как ожидалось. Не печатает 0, как в вашем выводе.   -  person typ1232    schedule 13.07.2013
comment
Какую IDE вы используете? Вы уверены, что правильно скомпилировали исходники?   -  person JeffRSon    schedule 13.07.2013
comment
ребята поняли мою ошибку мышления, да, это не печать 0, начиная с 5, она продолжается бесконечно, кроме печати 0   -  person Aman Singh    schedule 13.07.2013
comment
... на самом деле это не связано с использованием ключевого слова goto   -  person JeffRSon    schedule 13.07.2013
comment
@AmanSingh, тогда здесь нет настоящего вопроса   -  person Havenard    schedule 13.07.2013
comment
Разве это не должно быть удалено? Это никому не поможет в нынешнем состоянии.   -  person typ1232    schedule 13.07.2013


Ответы (3)


Если программа действительно печатает для вас 0, то это может быть серьезной проблемой с вашим компилятором (или даже с вашей машиной...). Я подозреваю, что он не печатает 0, но на самом деле ваш вопрос заключается в том, почему программа зацикливается бесконечно.

Это связано с тем, что тело if содержит только оператор печати. Поэтому, когда a достигает 0, он не печатается, а строки

a--;
goto begin;

до сих пор казнят. Машина подчинится, вернитесь к begin и цикл продолжится. Самое быстрое решение — поместить в фигурные скобки все операторы, которые вы хотите выполнить, когда a != 0:

if(a){
    printf("%d\n",a);
    a--;
    goto begin;
}

return 0;

Это заставит программу зацикливаться только до тех пор, пока a не станет 0, после чего она вернется.

Но настоящая проблема в том, что не используйте goto (для этого)! Это идеальная ситуация для использования while цикла:

while(a--){
    printf("%d\n", a);
}

return 0;

(Скобы вокруг while-тела здесь даже не являются строго необходимыми, а просто хорошей практикой)

person Kninnug    schedule 13.07.2013
comment
Вы имели в виду while(a--)? - person 1''; 14.07.2013
comment
Это имеет больше смысла - person Kninnug; 14.07.2013

Это потому, что после if снова выполняется оператор goto и тогда значение a уже стало отличным от 0 . Теперь снова вы получаете оператор goto, и поэтому if продолжает выполняться и печатать отрицательные значения.

Рассмотрим этот вариант :-

Заявление

printf("%d\n",a);

выполняется только тогда, когда условие в if истинно. ИСТИНА здесь относится ко всему, что не равно 0, поэтому printf не выполняется, когда a равно 0, а выполняется для любого другого значения. Теперь a-- и goto выполняются за пределами if, поэтому они выполняются снова и снова, делая условие в if всегда истинным, а отрицательные значения печатаются бесконечно.

Тем не менее,

Мой вопрос: почему вы используете goto?

person 0decimal0    schedule 13.07.2013
comment
просто проверяю его работу, вот и все, на самом деле я изучаю C и спасибо всем за помощь - person Aman Singh; 13.07.2013
comment
@AmanSingh Имейте в виду, что если у вас нет для этого очень веской причины, вам не следует использовать goto. (И у вас, вероятно, нет веской причины для этого, если вы только начали изучать C.) - person ; 13.07.2013
comment
@AmanSingh, его очень старый стиль почти устарел. Тем не мение:) - person 0decimal0; 13.07.2013
comment
Понятно, ребята, и H2CO3, если нам нужно отправить выполнение обратно в любую часть программы, что мне использовать? - person Aman Singh; 13.07.2013
comment
@AmanSingh Петли. Пока, для, пока... - person ; 13.07.2013
comment
О, давай!! Я не сказал, что он печатает 0, почему мой ответ отрицательный. Пожалуйста, объяснитесь. - person 0decimal0; 13.07.2013
comment
Серьезно, голосование было молниеносным, даже не взглянув на мой ответ должным образом. Не могу понять, где и когда я написал, что печатает 0. Только что избежал инсульта LOL :D . И несмотря на запись 0 в выводе OP четко указано, что if не будет выполняться. - person 0decimal0; 13.07.2013

if a==1 -> Evaluates to TRUE
if a==0 -> Evaluates to FALSE
if a==-1 -> Evaluates to TRUE

и т.п.

Поэтому он будет отображать числа в порядке убывания, кроме 0, который не будет отображаться.

person Winks    schedule 13.07.2013