Между делом на работе, когда позволяет время, пишем свой движок нереляционной базы данных, в которой связи построены непредопределенным образом, наподобие свободных человеческих ассоциаций. Т.е. ее поведение непредсказуемо и зависит в основном от накопленного опыта. Нам за это не платят, делаем только «ради науки», не ожидая никаких конкретных
(
Read more... )
Reply
Reply
я последний раз использовал goto году этак в 94-м. если не раньше. там еще тогда появилась в бейсике интересная разновидность GOSUB ))
а сейчас пока не нужен.
Reply
Reply
Reply
int some_foo(int some_arg)
{
int ret_val = 0;
char* text = (char*)malloc(SOME_SIZE);
FILE* fi = fopen("path/to/file", "r");
...
if (!condition1) {
/* return -1; */
ret_val = -1;
goto ret_label;
}
...
if (!condition2) {
/* return -2; */
ret_val = -2;
goto ret_label;
}
...
ret_label:
free(text);
fclose(fi);
return ret_val;
}
В принципе, иногда я в таких случаях эмулирую goto через обертывание тела функции (до ret_label) в фальшивый цикл do ... while(false) и вместо goto ставлю break :) Но это может запутать еще больше читателя исходников.
Reply
if(!condition1){
ret_val = -1;
}
else{
if(!condition2){
...
}
}
free(text);
fclose(fi);
return ret_val;
про break читал, что, мол запутывает. на мой взгляд в редких случаях выхода и невложенного цикла он вполне хорошо читаем. конечно, если конструкцию усложнять, то нужно сокращать безусловные переходы.
Reply
Reply
Reply
string text; // или vector text(SOME_SIZE);
ifstream ifs("path/to/file");
...
if (!c1)
return -1;
...
if (!c2)
return -2;
...
return 0;
Reply
Reply
Reply
Reply
Reply
if (a)
{
block_A
if (b)
{
block_B
}
else
{
block_C
}
}
else
{
block_C
}
Хорошо, если block_C можно выразить одной строчкой, или выделить в функцию, а если нет, то проще всего поставить в первом блоке goto на второй block_C.
Reply
Leave a comment