Как преобразовать этот конкретный & quot; if / else & quot; блокирует троичный оператор?

Кто-нибудь может направить меня или преобразовать это, если еще в форму троичного оператора? Я использую стеки для создания текстового редактора, в котором он будет проверять скобки в коде, но мне нужна только помощь в сокращении этого кода с помощью троичного оператора.

            if(s.at(i)==x.at(j))
{
list.push_back(s.at(i));
}

if(s.at(i)==y.at(j))
{
if(!list.empty())
{

if(list.back()=='('  && s.at(i)==')')
{
v=1;
list.pop_back();
}
else if(list.back()=='{'  && s.at(i)=='}')
{
v=1;
list.pop_back();
}
else if(list.back()=='['  && s.at(i)==']')
{
v=1;
list.pop_back();
}

else
{
error_position=i+1;
}
}
else
{
error_position=i+1;
v=0;
}
}

-4

Решение

Тернарный оператор для выбора между ценности, не операции.

Имеет смысл переписать, если у вас есть условие, которое присваивает только одну и ту же переменную.
Например,

int x = 0;
if (something)
{
x = 12;
}
else
{
x = 34;
}

лучше как

int x = something ? 12 : 34;

Использование оператора в вашем коде не сделает его короче, а только более сложным и нечитаемым.
Также не ясно, каков будет его результат.
Единственным вероятным кандидатом является значение, присвоенное v, но вы не назначаете на v в каждой ветке, так что нет.

Очевидное сокращение было бы просто присоединиться к вашим трем условиям с ||, но лучшим путем может быть абстрагирование теста полностью, например,

bool matching_brackets(char p1, char p2)
{
return (p1 == '(' && p2 == ')')
|| (p1 == '{' && p2 == '}')
|| (p1 == '[' && p2 == ']');
}

// ...
if(s.at(i)==y.at(j))
{
if (list.empty())
{
v = 0;
error_position = i + 1;
}
else if (matching_brackets(list.back(), s.at(i)))
{
v = 1;
list.pop_back();
}
else
{
error_position = i + 1;
}
}
// ...
3

Другие решения

Ваш код должен быть четким для чтения, и любое введение здесь троичных операций сделает его менее понятным, а не лучше, и это также не улучшит производительность.

Тернарный оператор, как правило, не должен иметь побочных эффектов и должен просто выбирать, какое значение использовать. min () — хорошее использование троичного слова, т.е. (a<b)?a:b

В вашем коде нет блока, который был бы лучше выражен через троичный оператор. Как правило, я бы не использовал at () и, конечно, не то же самое в () несколько раз в одном блоке. Так что рассчитайте s.at (i) один раз, поместите его в значимую переменную и используйте его.

2