Информация об изменениях

Сообщение Re[2]: return1, return2 от 24.01.2024 3:29

Изменено 29.01.2024 4:39 Sinclair

Re[2]: return1, return2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А именно так — а где все же выход из функции ? Ведь return тут вовсе не выход, а присваивание некоей скрытой переменной result1, result2...

PD>А настоящий return будет лишь закрывающей фигурной скобкой. А если я хочу именно выйти из функции внутри какого-то if — else — for... ?
Совершенно согласен. Если пытаться напилить язык, который работает именно с запрошенным синтаксисом, то возможен взрыв мозга.


int/string/int* MyFunc()
{
int res1 = 5;
int* res3 = (int*)malloc…;

return1 res1;
if (res1 == 0)
return2 "foo"
else
return2 "bar";

for (int i =0; i< 42; i++)
return3 res3++;
}

PD>В интерпретаторе такое можно позволить. Пусть он отслеживает, каким result присваивались значения и при выходе проверяет, всем ли присвоено.

То-то и оно. Внезапно оказывается, что вот такой код делает совершенно не то, чего ожидается:
int/int find(int[] array, int length, int value)
{ 
   for(int i=0; i<length; i++)
     if (array[i] == value)
     {
       return1 i;
       return2 value;
     }
   return1 -1;
   return2 0;
}


PD>В компиляторе — нет. Совершенно ненужные накладные расходы.

Тут даже в не в расходах компилятора дело. Современный компилятор типа C# при возврате туплов проверяет definite assignment. Дело в расходе умственной энергии программиста.
Re[2]: return1, return2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А именно так — а где все же выход из функции ? Ведь return тут вовсе не выход, а присваивание некоей скрытой переменной result1, result2...

PD>А настоящий return будет лишь закрывающей фигурной скобкой. А если я хочу именно выйти из функции внутри какого-то if — else — for... ?
Совершенно согласен. Если пытаться напилить язык, который работает именно с запрошенным синтаксисом, то возможен взрыв мозга.


int/string/int*   MyFunc()
{
   int res1 = 5;
   int* res3 = (int*)malloc…;

   return1 res1;
   if (res1 == 0)
     return2 "foo"
   else
     return2 "bar";

   for (int i =0; i< 42; i++)
      return3 res3++;
}


PD>В интерпретаторе такое можно позволить. Пусть он отслеживает, каким result присваивались значения и при выходе проверяет, всем ли присвоено.

То-то и оно. Внезапно оказывается, что вот такой код делает совершенно не то, чего ожидается:
int/int find(int[] array, int length, int value)
{ 
   for(int i=0; i<length; i++)
     if (array[i] == value)
     {
       return1 i;
       return2 value;
     }
   return1 -1;
   return2 0;
}


PD>В компиляторе — нет. Совершенно ненужные накладные расходы.

Тут даже в не в расходах компилятора дело. Современный компилятор типа C# при возврате туплов проверяет definite assignment. Дело в расходе умственной энергии программиста.