Сообщение 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 присваивались значения и при выходе проверяет, всем ли присвоено.
То-то и оно. Внезапно оказывается, что вот такой код делает совершенно не то, чего ожидается:
PD>В компиляторе — нет. Совершенно ненужные накладные расходы.
Тут даже в не в расходах компилятора дело. Современный компилятор типа C# при возврате туплов проверяет definite assignment. Дело в расходе умственной энергии программиста.
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... ?
Совершенно согласен. Если пытаться напилить язык, который работает именно с запрошенным синтаксисом, то возможен взрыв мозга.
PD>В интерпретаторе такое можно позволить. Пусть он отслеживает, каким result присваивались значения и при выходе проверяет, всем ли присвоено.
То-то и оно. Внезапно оказывается, что вот такой код делает совершенно не то, чего ожидается:
PD>В компиляторе — нет. Совершенно ненужные накладные расходы.
Тут даже в не в расходах компилятора дело. Современный компилятор типа C# при возврате туплов проверяет definite assignment. Дело в расходе умственной энергии программиста.
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. Дело в расходе умственной энергии программиста.