• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Język C - instrukcja continue oraz break

Object Storage Arubacloud
+2 głosów
436 wizyt
pytanie zadane 12 lutego 2022 w C i C++ przez Yacob Nowicjusz (190 p.)

Cześć,
mam problem z instrukcjami break oraz continue. W teorii wiem, że instrukcja break - powoduje przerwanie pętli, w której bezpośrednio tkwi oraz, że instrukcja continue powoduje przerwanie instrukcji w pętli występujących po słowie kluczowym continue, natomiast w przeciwieństwie do break nie przerywa działania pętli a jedynie przerywa dany obieg pętli i rozpoczyna następny. Aczkolwiek nie mam pojęcia co to do daje w praktyce. Poniżej wklejam kawałek kodu na którego podstawie prosiłbym o wyjaśnienie. Do tego mam pytanko, w jakim przypadku (w tym konkretnym kodzie) program będzie się wykonywał w nieskończoność? 

#include <stdio.h>

int main(){
    int ile=5;
    int tab[ile];
    int sum = 0;
    int i;
    tab[0]=-1; tab[1]=-2; tab[2]=3; tab[3]=-4; tab[4]=-5;
    i=0;
    while ( i<ile ){
        if (tab[i] >= 0){
            i++;
            continue;
        }
        sum+=tab[i];
        i++;
    }
    printf("suma = %d\n",sum);

    return 0;
}

O i jeszcze jedno. Co oznacza += przy sum w ostatnich linijkach kodu?

Z góry dziękuję za odpowiedź! 

1
komentarz 13 lutego 2022 przez VBService Ekspert (253,420 p.)
edycja 13 lutego 2022 przez VBService

@Yacob;

Do tego mam pytanko, w jakim przypadku (w tym konkretnym kodzie) program będzie się wykonywał w nieskończoność? 

@Mezeon;

W kodzie, który podałeś, akurat nie może powstać pętla nieskończona, ponieważ jej warunek na to nie pozwala - zmienna nie będzie cały czas mniejsza od ile (w tym przypadku 5), gdyż jest ona inkrementowana (zwiększana o jeden) w każdym przejściu pętli. Gdyby jej wartość pozostawała stała lub się zmniejszała, pętla byłaby nieskończona.

 

w tym przypadku pętla nie będzie nieskończona bo gdy i++, dla i > 4 spowoduje przekroczenie indeksu tablicy i "wywali" błąd.

 if (tab[i] >= 0)

lub się zmniejszała, pętla byłaby nieskończona.

spowoduje ten sam błąd, ale dla indeksu mniejszego od zera.

i = 5

LOOP
{
i--
tab[4] ok dla  i = 4
tab[3] ok dla  i = 3
tab[2] ok dla  i = 2
tab[1] ok dla  i = 1 
tab[0] ok dla  i = 0
tab[-1] ? dla  i = -1 itd.
}

 

P.S. @Yacob;

#include <stdio.h>
 
int main(){
    int ile=5;
    int tab[ile];
    tab[0]=-1, tab[1]=-2, tab[2]=3, tab[3]=-4, tab[4]=-5;

    int sum = 0;
    int i = -1;
    while ( i<ile ) {
        i++;
        if (tab[i] >= 0)
             continue;

        sum+=tab[i];
    }
    printf("suma = %d\n",sum);
 
    return 0;
}

lub

#include <stdio.h>
 
int main() {
    int tab[] = { -1, -2, 3, -4, -5 };

    int ile = sizeof(tab)/sizeof(tab[0]);
    int sum = 0;
    int i = -1;
    while ( i<ile ) {
        i++;
        if (tab[i] >= 0)
             continue;

        sum+=tab[i];
    }
    printf("suma = %d\n",sum);
 
    return 0;
}

 

nawet: How do I find the length of an array in C/C++?


while ( i<(*(&tab+1)-tab) ) { ... }

 

1 odpowiedź

+2 głosów
odpowiedź 12 lutego 2022 przez Mezeon Obywatel (1,550 p.)
wybrane 12 lutego 2022 przez Yacob
 
Najlepsza

Instrukcja break całkowicie przerywa pętlę, co powoduje przejście do dalszego wykonywania programu, "poniżej" pętli. Natomiast continue przerywa obecną iterację pętli i przechodzi do następnej, bez względu na to, co się znajduje za tą instrukcją.

Zapis zmienna += wartość jest równoznaczny z zmienna = zmienna + wartość. Tak samo działają podobne operatory typu -=, *= czy /=, z tym, że zamiast dodawania jest odpowiednio odejmowanie, mnożenie i dzielenie.

W kodzie, który podałeś, akurat nie może powstać pętla nieskończona, ponieważ jej warunek na to nie pozwala - zmienna nie będzie cały czas mniejsza od ile (w tym przypadku 5), gdyż jest ona inkrementowana (zwiększana o jeden) w każdym przejściu pętli. Gdyby jej wartość pozostawała stała lub się zmniejszała, pętla byłaby nieskończona.

W dodatku pętlę while w Twoim kodzie najlepiej zamienić na for, która to posiada zmienną określającą numer iteracji oraz nie jest potrzbne jej bezpośrednie inkrementowanie w ciele pętli:


#include <stdio.h>
 
int main(){
    int ile=5;
    int tab[ile];
    int sum = 0;
    int i;
    tab[0]=-1; tab[1]=-2; tab[2]=3; tab[3]=-4; tab[4]=-5;
    for (int i = 0;  i < ile; i++){
        if (tab[i] >= 0){
            continue;
        }
        sum+=tab[i];
    }
    printf("suma = %d\n",sum);
 
    return 0;
}

Inkrementacja zmiennej i będzie się tutaj dziać automatycznie, przy każdej kolejnej iteracji. 

1
komentarz 13 lutego 2022 przez VBService Ekspert (253,420 p.)
edycja 13 lutego 2022 przez VBService

W tym kontekście linia 7 jest niepotrzebna

int i;

 

P.S.  wink

#include <stdio.h>
  
int main() {
    int tab[5];
    tab[0]=-1, tab[1]=-2, tab[2]=3, tab[3]=-4, tab[4]=-5;
    
    int sum = 0;
    for (auto i: tab) {
        if (i >= 0) continue;
        sum += i;
    }
    
    printf("suma = %d\n",sum);
  
    return 0;
}

 

komentarz 13 lutego 2022 przez Mezeon Obywatel (1,550 p.)
O tej konstrukcji akurat nie wiedziałem, dzięki :)
komentarz 13 lutego 2022 przez VBService Ekspert (253,420 p.)

w sumie to nawet

#include <stdio.h>
   
int main() {
    int tab[] = { -1, -2, 3, -4, -5 };

    int sum = 0;
    for (auto i: tab) {
        if (i >= 0) continue;
        sum += i;
    }
     
    printf("suma = %d\n",sum);
   
    return 0;
}

 

komentarz 13 lutego 2022 przez TOWaD Mądrala (6,000 p.)
przywrócone 13 lutego 2022 przez TOWaD
Ale czy to na pewno C? a nie C++.
2
komentarz 13 lutego 2022 przez Oscar Nałogowiec (29,320 p.)

@Mezeon, z tym continue to sprawa jest bardziej skomplikowana. Break to wyskok poza pętle, z continue to skok na sam koniec pętli. W pętli do ... while po continue wykonywane jest sprawdzenie warunku z while, a nie restart od do.

komentarz 13 lutego 2022 przez VBService Ekspert (253,420 p.)

@TOWaD, smiley no masz rację:  for (auto i: tab)  c++

Podobne pytania

0 głosów
0 odpowiedzi 370 wizyt
pytanie zadane 7 kwietnia 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
1 odpowiedź 153 wizyt
pytanie zadane 13 września 2020 w C i C++ przez Pelo Użytkownik (520 p.)
0 głosów
2 odpowiedzi 408 wizyt
pytanie zadane 2 lutego 2017 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...