2013-05-12 3 views
0

|| менее многословным и проще набрать, чем if (...), поэтому я хотел бы способ сделать следующее (что случается много в моем коде):Как использовать выражение `return()` как выражение?

int bar() {...; return successFlag;} 
int foo() { 
    bar() || return(...); // return early on errors 
    ... 
} 

возможно ли это?

Или еще лучше, можно ли return обратно main из bar, вместо цепочки через foo?

+1

Возможно, вы хотите прочитать об исключениях. И нет, 'return' не является выражением, и вы не можете использовать его так. –

+0

u can; t использовать такой синтаксис. для ошибки см. исключения – qwr

+0

Для вашего «еще лучшего» вопроса исключения - это путь. –

ответ

2

Для первой части нет: return - это ключевое слово, а не выражение, поэтому оно не может сочетаться в этой форме. Я думаю, вы инстинктивно читаете || буквально как значение «или» в смысле английского языка - очевидно, это не то, что это значит.

Для второй части вы могли бы - теоретически - используя исключения, но это сильно обескураженная практика. Исключения предназначены для «исключительных обстоятельств», а более конкретно, условий ошибки, из-за которых код не может восстанавливаться локально (в контексте текущей функции/метода) и где надлежащее действие должно быть определено на более высоком уровне.

Использование исключений в качестве общего механизма управления потоком имеет две проблемы:

  • Производительность: C++ компиляторы оптимизированы для «неисключительных» кодовых путей (потому что это то, что должно происходить нормально) и поэтому механизмы обработки исключений, как правило, очень медленные. Это связано не с отсутствием оптимизации кода, а с необходимостью того, чтобы механизм имел нулевую или почти нулевую стоимость, если нет исключений, даже если затраты на исключения требуют много работы для обработки.

  • Ясность/проверяемость кода: использование исключений для потока управления делает код чрезвычайно трудным для чтения и модульного тестирования надлежащим образом изолированным.

+0

ОП не описал контекст своего кода, но комментарий в его коде * * означает, что 'bar', возвращающий false, означало бы ошибку, поэтому мне кажется, что ситуация OP будет квалифицироваться как« ошибка условие, из которого код не может восстановиться локально ". – sepp2k

+0

Возможно, упомянуть стиль раннего выхода 'if (! Bar()) return ERROR;' это было бы просто и понятно на мой взгляд. Вы можете (и я) поставить ясность на следующей строке. – Will

+0

@ sepp2k, я вижу вашу точку зрения о комментарии в коде; Я этого не заметил. Я согласен, конечно, что если вы действительно говорите о восстановлении после ошибок, исключения являются полностью подходящим механизмом. –

-2

Для первой части - НЕТ. Для второго: setjmp и longjmp. Но учтите, что оба они подрывают обычные вызовы деструктора на основе стека на C++ и, вероятно, не смешиваются с исключениями.

+2

Я бы никогда не рекомендовал setjmp/longjmp. Возможно, хорошо, если опытный программист узнает об этом сам по себе, но он слишком сложный и наполнен пит-лапами для новичков. –

Смежные вопросы