Фигурные скобки (область действия) связаны с неожиданным выводом цикла 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")
^
Как упоминалось в комментариях, отступ не соответствует паре операторов.