Фигурные скобки (область действия) связаны с неожиданным выводом цикла if-elseif в C++

Я использовал обычную лестницу для обновления некоторых переменных в зависимости от условий. Условие может быть либоa,bилиc. Вот почему я использую лестницу.

Но когда я используюif-elseifлестницу без фигурных скобок, я не получаю требуемого результата. Это как если бы код перетекал только в первый, и если условие ложно, он не переходил бы в другой.else-ifх. Насколько я знаю, область действия по умолчаниюifблок находится на 1 строку ниже, верно? Итак, даже если я воздержусь от использования фигурных скобок, все должно работать нормально, как я и ожидаю, верно?

Если я использую фигурные скобки, я получаю желаемый результат.

      #include <iostream>
#define int long long
#define endl "\n"
using namespace std;

signed main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL);

    int t; cin >> t;
    int n;

    while (t--){
        cin >> n;
        int min_counter_11 = 1e10;
        int min_counter_10 = 1e10;
        int min_counter_01 = 1e10;
        while(n--){
            int m;
            string s;

            cin >> m >> s;

            if (s == "11")
                if (m < min_counter_11)
                    min_counter_11 = m;
            else if (s == "10")
                if (m < min_counter_10)
                    min_counter_10 = m;
            else if (s == "01")
                if (m < min_counter_01)
                    min_counter_01 = m;
        }
        int res = min(min_counter_01 + min_counter_10,min_counter_11);

        if (res > 1e9)
            cout << -1 << endl;
        else
            cout << res << endl;
    }
}

3 ответа

Для начала эта директива:

      #define int long long

не имеет никакого смысла.

Также вам необходимо включить<string>заголовок:

      #include <string>

Что касается вашего вопроса, эти утверждения:

      if (s == "11")
    if (m < min_counter_11)
        min_counter_11 = m;
else if (s == "10")
    if (m < min_counter_10)
        min_counter_10 = m;
else if (s == "01")
    if (m < min_counter_01)
        min_counter_01 = m;

на самом деле эквивалентны:

      if (s == "11")
    if (m < min_counter_11)
        min_counter_11 = m;
    else if (s == "10")
        if (m < min_counter_10)
            min_counter_10 = m;
        else if (s == "01")
            if (m < min_counter_01)
                min_counter_01 = m;

Этоelseчасть принадлежит ближайшему оператору и не имеет ничего общего с областью действия оператора или с тем, как вы делаете отступы в своем коде (в отличие, например, от Python).

Вам следует переписатьifоператоры следующим образом, используя фигурные скобки вокруг составных операторов:

      if (s == "11")
{
    if (m < min_counter_11)
        min_counter_11 = m;
}
else if (s == "10")
{
    if (m < min_counter_10)
        min_counter_10 = m;
}
else if (s == "01")
{
    if (m < min_counter_01)
        min_counter_01 = m;
}

Ваш код:

      if (s == "11")
    if (m < min_counter_11)
        min_counter_11 = m;
else if (s == "10")
    if (m < min_counter_10)
        min_counter_10 = m;
else if (s == "01")
    if (m < min_counter_01)
        min_counter_01 = m;

эквивалентно более точному отступу:

      if (s == "11")
    if (m < min_counter_11)
        min_counter_11 = m;
    else if (s == "10")
        if (m < min_counter_10)
            min_counter_10 = m;
        else if (s == "01")
            if (m < min_counter_01)
                min_counter_01 = m;

C++ не меняет вашу логику в зависимости от вашего отступа.

Мой компилятор выдает следующие предупреждения для вашего кода:

      scratch/src/s13.cpp:32:13: warning: add explicit
      braces to avoid dangling else [-Wdangling-else]
            else if (s == "01")
            ^
scratch/src/s13.cpp:29:13: warning: add explicit
      braces to avoid dangling else [-Wdangling-else]
            else if (s == "10")
            ^

Как упоминалось в комментариях, отступ не соответствует паре операторов.

Другие вопросы по тегам