Форум программистов, компьютерный форум CyberForum.ru

Инструкция break - C++

Восстановить пароль Регистрация
 
ramses
-2 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 55
03.11.2012, 15:29     Инструкция break #1
Эм, балуюсь с C++. Значит, отбираю простые числа, первый вариант программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <cstdio>
#include <cstring>
using namespace std;
 
int main() {
    int i, j, k, simpleNums[200];
 
    k = 0;
    for (i=2; i<200; i++) {
        for (j=2; j<i; j++) {
            if (!(i%j))
                break;
        if (j == i-1)
            simpleNums[k] = i;
            k++;
        }
    }
 
    for (i=0; i<k; i++)
        cout << simpleNums[i] << " ";
 
    return 0;
}
Получаю ошибку Segmentation fault. Раньше не попадалась, почитал в Википедии о ней, ничего не понял. Потом обратил внимание на то, что не выделил фигурными скобками второе условие, исправил:

C++
1
2
3
4
5
6
7
8
9
10
11
    k = 0;
    for (i=2; i<200; i++) {
        for (j=2; j<i; j++) {
            if (!(i%j))
                break;
        if (j == i-1) {
            simpleNums[k] = i;
            k++;
        }
        }
    }
Всё работает. Потом обратил внимание на то, что две фигурные скобки в цикле находятся на одном уровне. Сдвинул второе условие, понял, что второе моё условие относится к второму циклу, а не к первому, как я задумывал изначально. Пришёл к выводу, что break делает выход из инструкции, а условие - это тоже инструкция. Т.е. чтобы выйти из цикла, надо использовать два break. Что и подтверждается таким вариантом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    k = 0;
    for (i=2; i<200; i++) {
        j = 2;
        for (; j<i; j++) {
            if (!(i%j)) {
                break;
                break;
            }
        }
        if (j == i) {
            simpleNums[k] = i;
            k++;
        }
    }
Потом заглянул в книжку (вдохновлялся примером из неё), увидел следующее:

C++
1
2
    ...for (j=2; j<=(i/j); j++)
        if (!(i%j)) break;
Потыркал свой код и убедился, что и мне достаточно одного break в случае, если не выделять для условия блока кода (фигурных скобок). Получается, так:

C++
1
2
3
    for (; j<i; j++)
        if (!(i%j))
            break;
и так:

C++
1
2
3
4
    for (; j<i; j++) {
        if (!(i%j))
            break;
    }
Следовательно, break делает выход из ближайшего блока кода (а цикл изначально блок)? Ага, вроде бы так, но почему работает второй приведённый мною вариант? Короче, я запутался :/
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2012, 15:29     Инструкция break
Посмотрите здесь:

программа игнорирует break C++
Break и return C++
Ключевое слово break C++
C++ Оператор break
C++ Цикл do.while и break
оператор break C++
C++ Ошибка доступа на break
Callback + switch. Break needed C++
Можно ли в C++ ставить метки-break? C++
Использование break C++
C++ Break не выводит из цикла while
C++ Цикл for и оператор break

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
03.11.2012, 15:40     Инструкция break #2
break заканчивает выполнения цикла или фазы оператора switch.

C++
1
2
3
4
5
6
7
    for (i=2; i<200; i++)
    {
        for (j=2; j<i; j++)
        {
            if (!(i%j))
                break;
...
При выполнении условия
C++
1
f (!(i%j))
второй цикл прекращается.
ramses
-2 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 55
03.11.2012, 15:54  [ТС]     Инструкция break #3
Стоп.

C++
1
2
3
4
5
6
7
8
    for (j=2; j<i; j++) {
        if (!(i%j))
            break;
        if (j == i-1) {
            simpleNums[k] = i;
            k++;
        }
    }
Второе условие в цикле, верно? И если он завершится, то и заполнение массива не произойдёт. А оно происходит)
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 538
03.11.2012, 15:55     Инструкция break #4
Если оно происхордит, значит не выполняется условие if (!(i%j))
ramses
-2 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 55
03.11.2012, 16:00  [ТС]     Инструкция break #5
Точно) Спасибо.
Yandex
Объявления
03.11.2012, 16:00     Инструкция break
Ответ Создать тему
Опции темы

Текущее время: 16:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru