Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 9 из 9
  1. #1
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±

    Оператор возврата (return)

    Приветствую. С вами я, Deimos, и сегодня я хотел бы попробовать рассказать Вам о том, что же такое return, как его правильно использовать и что с помощью него можно провернуть.

    Начать стоит с определений. Для начала определимся, что же такое "оператор".


    Операторэто часть программы, которая может быть выполнена отдельно.
    Это означает, что оператор определяет некоторое действие.

    Другими словами можно сказать, что оператор - это своеобразная команда для скрипта, предписывающая определённую реакцию этого самого скрипта на её (команды) вызов





    Оператор возврата
    «Return»
    это оператор управления (оператор перехода),обеспечивающий немедленный выход из функции.




    * Данный оператор имеет два важных применения:

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



    * Формат оператора return

    PHP код:
    return значение;        //Где "значение" является необязательным 






    • Для чего же нужен этот выход из функции:

    Прежде всего, с помощью данного оператора, мы можем управлять действиями виртуальной машины при выполнении кода. Например, нам не нужно выполнять определённый код функции, если у игрока нет на руках 5000$. Тут то нам и придёт на помощь данный оператор. Но это ещё не всё.

    Оптимизация.

    Допустим, у нас есть подобный, не самый качественный в плане структуры, код команд
    PHP код:
    public OnPlayerCommandText(playeridcmdtext[])
    {
        if(!
    strcmp("/команда_1"cmdtexttrue))
        {
            
    SetPlayerHealth(playerid98304);
            
    SendClientMessage(playerid0xFF0000FF"Теперь ваше здоровье мигает :3");
        }
        if(!
    strcmp("/команда_2"cmdtexttrue))
        {
            
    printf("Продам гараж");
        }
        if(!
    strcmp("/команда_3"cmdtexttrue))
        {
            
    Ban(playerid);
        }
        if(!
    strcmp("/команда_4"cmdtexttrue))
        {
            
    Kick(playerid);
        }
        return 
    1;

    А вот как код должен выглядеть
    PHP код:
    public OnPlayerCommandText(playeridcmdtext[])
    {
        if(!
    strcmp("/команда_1"cmdtexttrue))
        {
            
    SetPlayerHealth(playerid98304);
            
    SendClientMessage(playerid0xFF0000FF"Теперь ваше здоровье мигает :3");
            return 
    1;
        }
        else if(!
    strcmp("/команда_2"cmdtexttrue))
        {
            
    printf("Продам гараж");
            return 
    1;
        }
        else if(!
    strcmp("/команда_3"cmdtexttrue))
        {
            
    Ban(playerid);
            return 
    1;
        }
        else if(!
    strcmp("/команда_4"cmdtexttrue))
        {
            
    Kick(playerid);
            return 
    1;
        }
        return 
    0;

    Но эти оба варианта будут работать практически одинаково (не считая того, что в первом случае мы вернули в колбэк единицу, дабы избавиться от сообщения "Unknown command" (О реакции некоторых колбэкков на возвраты поговорим чуть позже) и того, о чём я напишу дальше), тогда в чём разница, спросите Вы?

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

    Во втором же случае мы:
    1. Составили правильно условия.

       Что за чушь несёт этот полоумный?
      Одинаковых команд не может быть, поэтому удачнее всего компилятору указать проверять каждую команду по очереди, пока он не найдёт нужную. То есть при выполнении одного из условий последующие условия отбрасываются, так как мы использовали другой оператор - else (иначе). Вот так, примерно, выглядит структура подобного условия:
      PHP код:
      яблоко зелёное?
      {
          
      да
      }
      нета сейчас яблоко зелёное?//Если сработало, например, это условие
      {
          
      да//Значит яблоко зелёное
      }
      нета сейчас яблоко зелёное?//Яблоко уже зелёное и значит, что эта проверка бессмысленна => её можно отбросить
      {
          
      да
      }
      небо голубое?//А вот эта проверка уже будет работать, если мы не укажем для неё оператор else и не будем использовать в верхних условиях оператор возврата. В данном случае, если после выполнения условий выше нам нужно выполнить и это условия, выше return ставить не нужно, ведь нам не нужно прекращать выполнение кода, если яблоко зелёное
      {
          
      Да


    2. Указали компилятору "границы" каждого из условий с расчётом на то, что, после выполнении команд, никакого другого нужного кода в блоке колбэка (ниже нашей команды) нет и что нужно выполнить код именно до этой самой "границы".


    Всем этим мы освободили виртуальную машину от выполнения ненужных действий (в первом случае, даже после нахождения нужной команды, АМХ машина продолжил бы выполнение условий, продолжая поиск уже найденной команды), следовательно АМХ машина быстрее разберётся с кодом команды и быстрее начнёт обрабатывать другой код. Это и называется оптимизацией ;)


    Читабельный вид.

    Иными словами, данный оператор позволяет формировать проверки в более понятный для скриптера вид. Согласитесь, гораздо удобнее понять смысл такого условия
    PHP код:
    if(!IsPlayerConnected(playerid)) return printf("Игрок с ID %d оффлайн"playerid); 
     Данная проверка может выглядеть и так:
    PHP код:
    if(IsPlayerConnected(playerid) == 0) return printf("Игрок с ID %d оффлайн"playerid); 
    PHP код:
    if(!IsPlayerConnected(playerid)) 
    {
        
    printf("Игрок с ID %d оффлайн"playerid);
        return 
    1;

    PHP код:
    if(IsPlayerConnected(playerid) == 0
    {
        
    printf("Игрок с ID %d оффлайн"playerid);
        return 
    1;

    Все эти записи означают одно: Если функция IsPlayerConnected вернула значение, равное нулю - отправим сообщение в консоль и прекратим выполнение кода.

    Нежели такой
    PHP код:
    if(IsPlayerConnected(playerid))
    {
        if(
    любое другое условие)
        {
            
    //Тут ещё куча других условий/функций
        
    }
    }
    else 
    {
        
    printf("Игрок с ID %d оффлайн"playerid);
        return 
    1;
    }
    //Данный код может иметь так же сокращённый вариант
    //else return printf("Игрок с ID %d оффлайн", playerid); 
    Ведь мы сразу видим, что если игрок не в сети, будет отправлено сообщение в консоль. Во втором же варианте нам придётся просматривать весь код функции и выискивать скобку, отвечающую за "закрытие" блока нашего условия и уже смотреть на действие, которое мы указали после оператора else.
     Как правильно формировать подобные условия
    Формирование подобных условий заключается в отрицании нужного нам результата и возврата нужного нам действия. В первом случае условие выглядит так:
    PHP код:
    если игрок не в сети отправим сообщение в консоль
    код 
    //так как в условии выше мы указали оператор возврата, при выполнении условия АМХ машина прекратит выполнение дальнейшего кода 
    //=> если условие не пройдёт (игрок окажется в игре), АМХ машина продолжит выполнение кода ниже 
     Данный код можно построить и так:

    PHP код:
    если игрок не в сети отправим сообщение в консоль//С помощью "тире" обозначим место расположения "return" в коротких вариантах записи кода
    иначе
    {
        
    код

    То есть
    PHP код:
    if(!IsPlayerConnected(playerid)) return printf("Игрок с ID %d оффлайн"playerid); 
    else 
    {
        
    //код
        
    return 1;



    Во втором случае код имеет следующую структуру
    PHP код:
    если игрок в сети
    {
        
    выполним код
    }
    иначе покажем сообщение 
    И получается для того, чтобы сделать укороченный вариант, мы, как это делается в математических уравнениях, меняем местами наш код, при этом меняя "знак" у проверки с положительного на отрицательный
    PHP код:
    если игрок НЕ в сети  покажем сообщение
    иначе
    {
        
    выполним код

    Но так, как в проверке онлайна стоит оператор возврата, выполнится весь последующий код может только при условии нахождения игрока в онлайне. Поэтому мы ещё сокращаем нашу запись, включая логику и избавляясь от ненужного кода


    PHP код:
    если игрок НЕ в сети  покажем сообщение//Если игрок оффлайн, отправим сообщение в консоль и прекратим выполнение кода
    иначе//Этот код выполнится только если игрок онлайн, а значит и "иначе" тут не обязательно
    {
        
    выполним код

    Преобразуется в
    PHP код:
    если игрок НЕ в сети  покажем сообщение//Если игрок оффлайн, отправим сообщение в консоль и прекратим выполнение кода
    выполним код 
    Согласитесь, если разобраться как это работает, гораздо понятнее последняя версия кода, нежели первая.

    Если же при невыполнении условия нужно выполнить какой-то другой код, проверку так же можно сделать гораздо читабельнее.
    Например, есть такое условие:
    PHP код:
    if(GetPlayerMoney(playerid) > 5000)//Если у игрока больше 5000
    {//Выполним следующий код
        
    GivePlayerMoney(playerid, -5000);
        
    SendClientMessage(playerid0xFF0000FF"Вы купили ничего за 5000$. Поздравляем!");
    }
    else
    //Если у игрока меньше 5000
    {//Выполним этот код
        
    GivePlayerMoney(playerid5000);
        
    SendClientMessage(playerid0xFF0000FF"Вот Вам 5000$. Купите наше ничего. Пожалуйста...");

    Его тоже можно сократить в более читабельный вид с помощью оператора возврата
    PHP код:
    if(GetPlayerMoney(playerid) < 5000)//Если у игрока меньше 5000
    {//Выполним следующий код...
        
    GivePlayerMoney(playerid5000);
        
    SendClientMessage(playerid0xFF0000FF"Вот Вам 5000$. Купите наше ничего. Пожалуйста...");
        return 
    1;//... и прекратим выполнение кода на этом месте
    }
    //Если же условие выше не сработало, значит у игрока больше 5000 (тут и ежу понятно, думаю), значит мы можем выполнить следующий код
    GivePlayerMoney(playerid, -5000);
    SendClientMessage(playerid0xFF0000FF"Вы купили ничего за 5000$. Поздравляем!"); 
    Таким способом мы избавились от двух скобок и сделали код более эстетичным (в данном случае польза не так видна, но когда вы пишете объёмный код с большими проверками, гораздо приятнее глазу подобный вариант, нежели первый)



    • Для чего же нужно возвращать определённые условия и какой с этого толк:

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

    Представим следующую ситуацию: есть определённая функция А, в которой выполняется код и, дабы сделать код более читабельным/для удобства или по какой-то ещё причине, определённый кусок кода помещён в другую функцию, созданную самим скриптером. Назовём её функцией "Б". Так вот, у нас есть функция А и функция Б, которая вызывается в функции А. В этой функции Б выполняются определённый код, от которого зависит выполнение кода в функции А. Это могут быть проверки или расчёт каких-то значений. Это не так важно. А важно то, что каким-то образом нам нужно передать полученные данные из функции Б в функцию А. Мы можем создать глобальную переменную, в которую поместим полученные данные из функции Б и пусле будем использовать их в функции А, но это лишние байты памяти (напомню, для всех глобальных переменных уже при компиляции резервируется определённое число байт в памяти АМХ машины) и лишние действия. Тут то к нам на помощь и приходит возможность оператора возврата возвращать определённые значения. Давайте я покажу Вам, для наглядности, примеры кода обоих ситуаций
     Ситуация намба 1

    PHP код:
    new GlobalVariable;//Наша глобальная переменная для того, чтоб перенести из второй функции значение в первую
    stock FunctionOne()
    {
        new 
    variable 10;//Создадим переменную и присвоим ей значение 10
        
    FunctionTwo(variable);//Вызовем вторую функцию, отправив в неё данные о значении нашей переменной
        
    printf("%d"GlobalVariable);//Отправим то, что выдала вторая функция, в консоль
        
    return 1;
    }
    stock FunctionTwo(argument)
    {
        
    GlobalVariable argument 5;//Отнимем от значения, которое передали в функцию 2 аргументом, пять и присвоим глобальной переменной значение, равное ответу
        
    return 1;



     Ситуация намба 2

    Тут есть 2 пути развития ситуации и оба верны, но использоваться должны в разных ситуациях
    Первый:
    PHP код:
    stock FunctionOne()
    {
        new 
    variable 10;//Создадим переменную и присвоим ей значение 10
        
    printf("%d"FunctionTwo(variable));//Вызовем вторую функцию и отобразим в консоль значение, которая она вернёт. 
        
    return 1;
    }
    stock FunctionTwo(argument)
    {
        return 
    argument 5;//Вернём ответ (в результате вернёт 5)

    Но такой способ не самый оптимальный, если с значением второй функции нам нужно работать несколько раз. Ведь если мы будем использовать такой способ, придётся вызывать одну и ту же функцию, заставляя её выполнять одинаковые действия, несколько раз, что не является оптимизированным вариантом, если логически посмотреть. Поэтому можно сделать так
    PHP код:
    stock FunctionOne()
    {
        new 
    variable 10;//Создадим переменную и присвоим ей значение 10
        
    new variable2 FunctionTwo(variable);//Создадим переменную и присвоим ей значение, которое вернёт функция
        
    printf("%d"variable2);//Отобразим то, что вернула функция, в консоль
        
    variable -= variable2*variable2;//Продолжим использовать значение, которое вернула наша функция
        
    return 1;
    }
    stock FunctionTwo(argument)
    {
        return 
    argument 5;//Вернём ответ (в результате вернёт 5)


    Таким образом мы облегчили жизнь себе и серверу, не забивая его статическую память лишней информацией, а лишь забивая динамическую (память стэка. С этим тоже стоит быть аккуратнее, не возвращая длинные строковые значения и тому подобное. Об этом есть хороший мануал от Tracker1).

    Но перемещение определённого куска кода в отдельную функцию и возврат значения - не единственная прелесть особенности return. С помощью данной особенности можно создавать определённые проверки, которые после можно использовать в более укороченном варианте в любой части кода. Все стандартные функции, позволяющие создавать те или иные проверки, работают именно по этому принципу. Приведу пример одной самописанной проверки:
    PHP код:
    stock IsValidText(const text[])//Создаём функцию, аргументом которой будет являться массив для текста
    {
        for(new 
    istrlen(text); ji++)//Запускаем цикл, число инерций которого будет равно числу символов в нашем аргументе
        
    {
            switch(
    text[i])//Проверяем каждый символ на наличие:
            
    {
                case 
    48..57'a'..'z''A'..'Z': continue;//Если символ в строке цифра, либо английская буква - начнём следующий такт
                
    default: return 0;//Если символ не является цифрой/буквой - вернём нуль
            
    }
        }
        return 
    1;//Если цикл прошёл нормально (в строке были только английские буквы и символы. То бишь каждый такт цикла прекращался на первой проверке), вернём единицу

    Таким образом если в строке обнаружится символ, который не проходит по первому условию в case, функция вернёт нуль. Иначе единицу. На основе этой информации мы можем построить проверку где-то в другом участке скрипта. например:
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        if(!
    IsValidText(text))//Если наша функция вернёт нуль, покажем сообщение и прервём выполнение паблика
        
    {
            
    SendClientMessage(playerid0xFF0000FF"В строке обнаружен запрещённый символ");
            return 
    0;
        }
        return 
    1;

    Таким способом можно создавать любые проверки, объединяя уже существующие в одну. Если кто до сих пор не понял, вернуть мы можем любое значение и уже опираясь на знаниях того, какое значение при какой ситуации возвращается, мы строим дальнейшие проверки.



    Теперь настало время поговорить о том, как реагируют стандартные колбэки на возвраты тех или иных значений. Для более удобного восприятия я создам таблицу
    Наименование колбэков: Значение: Реакция на возврат: Порядок обработки:

    OnPlayerCommandText
    1

    0
    Полное обрывание события.

    Скрипт передается во все скрипты, после обработки всеми скриптами выводиться собщения 'SERVER: Unknown command'.
    Филтрскрипты, гейммод.

    OnPlayerText
    1

    0
    Обрывание события, сообщение выводится в чат.

    обрывание события, сообщение не выводиться в чат и не обрабатывается остальными скриптами, полное обрывание.
    Филтрскрипты, гейммод.

    OnPlayerUpdate
    1

    0
    Нормальный режим игры.

    Рассинхронизация игрока: для всех игрок стоит на месте, с момента последнего полученного синхронизированного пакета, для него все по прежнему.
    Филтрскрипты, гейммод.

    OnRconCommand
    1

    0
    Обрывание события, команда передается в косноль, на этом обрывается.

    Обрывание события, передается во все скрипты.
    Филтрскрипты, гейммод.

    OnPlayerRequestSpawn
    1

    0
    Спавн игрока.

    При нажатии на Shift ничего не происходит.
    Филтрскрипты, гейммод.

    OnPlayerKeyStateChange
    1

    0
    Обрабатывается всеми скриптами.

    Обрабатывается только гейммодом
    Гейммод, филтрскрипты. (!)
    Все остальные события не имеют особой привязки к возвращаемым значениям, разница лишь в том что:
    1 - событие полность обрывается.
    0 - событие передается и обрабатывается всеми скриптами.

     События в которых можно вообще ни чего не возвращать (возможны варнинги компилятора):
    • OnVehicleStreamIn
    • OnVehicleStreamOut
    • OnPlayerStreamIn
    • OnPlayerStreamOut
    • OnDialogResponse
    • OnPlayerClickPlayer
    • OnPlayerSelectedMenuRow
    • OnPlayerExitedMenu
    • OnRconLoginAttempt
    • OnVehicleDamageStatusUpdate
    • OnVehiclePaintjob
    • OnVehicleRespray
    • OnVehicleMod


    Автор информации о реакции пабликов на возвраты - Stepashka

    Таким образом, при возвратах в данных колбэках, нужно учитывать эти данные, дабы получить желаемый результат.



    • Возврат функций:

    Так же стоить заметить, что и функции возможно вернуть в качестве значения. Точнее значение функции, которое она возвращает.
    Покажу на примере:
    PHP код:
    main()
    {
        
    printf("Функция 1 (25-18) == %d"FuncOne());//В итоге получим 7
        
    printf("Функция 2 (20+5) == %d"FuncTwo());//Во второй функции у нас получится 25
        
    printf("Функция 3 (20) == %d"FuncThree());//Третья функция вернёт значение 20
    }
    stock FuncOne()
    {
        return 
    FuncTwo()-18;
    }
    stock FuncTwo()
    {
        return 
    FuncThree();
    }
    stock FuncThree()
    {
        return 
    20;//Третья функция вернёт 20

    В предыдущем пункте мы говорили о реакции стандартных колбэков на определённые значения и при возврате функции надо учитывать какое значение эта функция возвращает.
    Даже стандартные функции возвращают определённые значения. Чему равны эти значения - можно узнать на сайте wiki.sa-mp.com, поискав нужную Вам функцию и посмотрев её описание.
     Скриншот




    На этом всё =)
    Если есть какие-либо вопросы, если что-то непонятно объяснено или есть какие-либо дополнения/исправления для данного урока, прошу написать об этом ниже.
    Всем постараюсь помочь, все мнения приму к сведению.

    Версия урока не окончательная и со временем возможны дополнения/исправления.
    С вами был DeimoS. Спасибо за внимание
    Автор урока - DeimoS

    Специально для портала Pro-pawn.ru
    При копировании данного материала, обязательно указывайте автора и ссылку на данный урок
    Последний раз редактировалось DeimoS; 21.10.2019 в 02:09.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  2. 20 пользователя(ей) сказали cпасибо:
    $continue$ (08.11.2015) bredvix (05.03.2014) codeo (15.06.2014) DesmoNd (02.02.2014) Desulaid (03.05.2015) Dima_Turkow (08.06.2014) Elaid (21.09.2014) enj0y (26.09.2016) Geebrox (19.07.2016) Mr.DeViLsS (07.11.2014) Mr_David (02.02.2014) Nikoo007 (02.03.2014) Nurick (07.09.2015) Salvacore (04.03.2014) semen7907 (08.02.2014) Straik32423 (21.06.2015) TimoXa32 (02.02.2014) Unreal (05.09.2015) [ForD] (02.02.2014) Серёжа Шардин (04.03.2014)
  3. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Писалось всё за один присест и разные части урока в разном порядке, поэтому где-то может быть несостыковочка или бред У самого уже взгляд "замылился" и всё, что увидел, переправил. Если найдёте недочёты - пишите, не стесняйтесь :3
    В планах сделать описание каждого из операторов в подобной форме, только более структурировано
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. #3
    Аватар для Mr_David
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.04.2013
    Сообщений
    63
    Репутация:
    54 ±
    Красавец xD

  5. #4
    Аватар для DesmoNd
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.01.2014
    Сообщений
    13
    Репутация:
    0 ±
    Супер.
    Очень полезный урок.
    Спасибо.

  6. #5
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Очень полезно.
    + позже дам.

  7. #6
    Аватар для [ForD]
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.11.2013
    Адрес
    Свердловская обл.
    Сообщений
    688
    Репутация:
    103 ±
    Мля,ты монстр просто :D
    Как и говорил раньше объяснять ты умеешь,по сути половину знал но и нового прилично узнал,но "ЭТО ШЕДЕВР!!!!" :popcorm2:

    P.S. там пара ошибок в тексте присутствует(не смертельно).
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

    25% времени в программировании уходит на размышления о том, что пользователь может сделать не так.[HR]/Брайан Хьюмс/





    #FIXSAMP

  8. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от [ForD] Посмотреть сообщение
    Мля,ты монстр просто :D
    Как и говорил раньше объяснять ты умеешь,по сути половину знал но и нового прилично узнал,но "ЭТО ШЕДЕВР!!!!" :popcorm2:

    P.S. там пара ошибок в тексте присутствует(не смертельно).
    По поводу ошибок подробнее, если можно. Писал всё за один присест и так, как сам понимаю принцип работы данного оператора (точнее когда-то изучал на примере return из С++ и тут уже объяснял опираясь на свой опыт + на ту инфу, которую помнил из учебников)

  9. Пользователь сказал cпасибо:
    Dima_Turkow (08.06.2014)
  10. #8
    Аватар для Серёжа Шардин
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.03.2014
    Сообщений
    16
    Репутация:
    4 ±
    Это был очень ценным уроком для меня =)
    Skype: sasha121na

  11. #9
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Спасибо огромное, теперь ты развеял мои сомнения о return =)



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •