Является ли хорошей практикой, если размер контейнера проверен и доступ к элементу выполняется по тому же условному выражению? - PullRequest
0 голосов
/ 01 сентября 2018

Какой из следующих кодов предпочтительнее между двумя из них и почему?

1.

std::stack<int>stk;

//Do something

if( stk.empty() == true || stk.top() < 10 )
{
    //Do something.
}

или

2

std::stack<int>stk;

//Do something

if( stk.empty() == true )
{
    //Do something.
}
else if( stk.top() < 10 )
{
    //Do something.
}

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Встроенные операторы && и || выполняют оценку короткого замыкания (не оценивайте второй операнд, если результат известен после оценки первого). Таким образом, выражение stk.empty() || stk.top() < 10 является безопасной и хорошей практикой, stk.top() вызывается только если stk.empty() оценивается как false. Другими словами, операторы были спроектированы таким образом, чтобы разрешить такое использование.

0 голосов
/ 01 сентября 2018

Это полностью зависит от варианта использования. В первом коде у вас есть условие ИЛИ для пустого стека и проверка значения элемента, если элемент существует. Итак, это понятно, и вы можете продолжить работу с кодом.

Во втором коде вы хотите выполнить что-то другое для обоих условий. Следовательно, вы поместили условия в цикл if else.

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

std::stack<int>stk;

if(stk.top() < 10 )
{
   //Do something.
}
else if(stk.empty() == true)
{
  //Do something
}

Это приведет к ошибке времени выполнения, так как стек пуст, но вы обращаетесь к верхнему элементу перед проверкой состояния пустого стека. Ошибка ошибки

Надеюсь, ответ прояснит.

...