Когда использовать return и как контролировать, куда он идет в C? - PullRequest
1 голос
/ 30 апреля 2020

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

 preference = candidate_count +1; 

, и завершаю пока l oop, но могу ли я использовать return здесь? Могу ли я использовать return для выхода из вложенного для l oop, а пока l oop до go обратно к основному для l oop?

В ситуации, когда кандидат исключается, я делаю

 else preference++; j = 0;

Если бы я вернулся сюда, он бы go вернулся к вложенному для l oop. Я просто немного сбит с толку, потому что кажется, что вы можете написать код, даже не используя return, если установите базу для завершения программы.

 for(int i =0; i<voter_count;i++)
 {
    //restart the for loop and look for preference 1
    int preference =0;
    while (preference <candidate_count)
    {
    for(int j = 0; j<candidate_count;j++)
    {
         if(preferences[i][j] ==  preference)
        {
            if(candidates[j].eliminated == false)
            {
              candidates[j].votes ++;
              preference = candidate_count +1; 
             }   
            else
             preference++;
             j = 0;
            }
        }
    }
}

1 Ответ

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

return выйдет из функции и go вернется к вызывающей стороне. Например, в следующем коде

int foo(int bar){
    int tmp1=0,tmp2=0;
    while (bar--){
        tmp1=bar;
        while (tmp1--){
            tmp2++
            if (tmp2>5){
                 return tmp2;       /* (A) */
            }
        }
   }
   printf("world\n");      /* (X) */
   return tmp2;
}

int main(){
/* whatever */
    foo(10); /* (B) */
    printf("hello\n");  /* (C) */
/* whatever */
}

После того, как программа нажмет (B), она перейдет к функции foo. Когда он нажимает (A), он переходит на (C), обратно к вызывающей стороне. Строка (X) никогда не будет выполнена.

Для выделения вложенной l oop, но не из всей функции, используйте goto.

...