Тернарен оператор ?:

В този раздел можете да намерите полезни кодове и уроци свързани с PAWN скриптинга.
Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Тернарен оператор ?:

Мнение от TheRedShoko » 07 Фев 2017, 13:08

Реших да напиша един урок относно тернарния оператор, защото когато бях начинаещ в програмирането ми беше много интересно как работи и ми отне време, за да разбера за какво става дума. В тази тема на кратко ще се опитам да ви обясня какво представлява и къде може да се използва.

Тернарният оператор е inline условна конструкция (if-else) (т.е. може да използвате при параметри, return, switch-case, за да си спестите цяла if-else конструкция). Форматът на тернарния оператор е следният - условие ? стойност_при_вярно : стойност_при_грешно. Важно е стойностите при вярно условие и при грешно условие да са от един и същ тип данни (т.е. ако първата стойност е число, то задължително и втората трябва да е!). Ако типът данни е тип string, обърнете внимание, че не можете да използвате placeholders в него (%s, %d, %c, %i, %f, %x) За да стане по-ясно за какво говоря ще покажа един пример.

Код с пълна If-else конструкция

Код за потвърждение: Избери целия код

#include <amxmodx>

public plugin_init()
{
    register_plugin("Ternary operator example", "1.0", "AMXX-BG.info");
    
    register_clcmd("say /alive", "IsPlayerAlive");
}

public IsPlayerAlive(id)
{
    if (is_user_alive(id))
    {
        client_print(id, print_chat, "You are alive!");
    }
    else
    {
        client_print(id, print_chat, "You are dead!");
    }
}
 
В този случай, вместо да използваме цяла if-else конструкция, може просто да вмъкнем тернарен оператор като параметър, който да определя дали да изпише alive или dead

Код за потвърждение: Избери целия код

#include <amxmodx>

public plugin_init()
{
    register_plugin("Ternary operator example", "1.0", "AMXX-BG.info");
    
    register_clcmd("say /alive", "IsPlayerAlive");
}

public IsPlayerAlive(id)
{
    client_print(id, print_chat, "You are %s", is_user_alive(id) ? "alive" : "dead"); 
}
 
Разбира се, тернарният оператор може да се използва не само при извикване на функция/натив, той може да се използва и при присвояване на променлива. Ето и пример

Код за потвърждение: Избери целия код

new bool:blIsUserAlive = is_user_alive(id) ? true : false; 
Тернарният оператор (ако бъде използван добре), може да се използва и като switch-case конструкция. Ето пример с меню, от което играч може да си избере колко кръв да получи:

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <fun>

public plugin_init()
{
    register_plugin("Ternary Switch-Case Exmaple", "1.0", "TheRedShoko");
    
    register_clcmd("say /health", "DisplayMenu");
}

public DispalyMenu(id)
{
    new iMenu = menu_create("Health menu", "MenuHandler");
    
    menu_additem(iMenu, "5 health");
    menu_additem(iMenu, "10 health");
    menu_additem(iMenu, "15 health");
    menu_additem(iMenu, "20 health");
    
    menu_display(id, iMenu);
}

public MenuHandler(id, iMenu, Item)
{    
    new iHealthAmount;
    
    switch (Item)
    {
        case 0: iHealthAmount = 5;
        case 1: iHealthAmount = 10;
        case 2: iHealthAmount = 15;
        case 3: iHealthAmount = 20;
        default: iHealthAmount = 0;
    }
    
    set_user_health(id, get_user_health(id) + iHealthAmount);
    
    menu_destroy(iMenu);
} 
=>

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <fun>

public plugin_init()
{
    register_plugin("Ternary Switch-Case Exmaple", "1.0", "TheRedShoko");
    
    register_clcmd("say /health", "DisplayMenu");
}

public DispalyMenu(id)
{
    new iMenu = menu_create("Health menu", "MenuHandler");
    
    menu_additem(iMenu, "5 health");
    menu_additem(iMenu, "10 health");
    menu_additem(iMenu, "15 health");
    menu_additem(iMenu, "20 health");
    
    menu_display(id, iMenu);
}

public MenuHandler(id, iMenu, Item)
{    
    new iHealthAmount = Item == 0 ? 5 :
                        Item == 1 ? 10 :
                        Item == 2 ? 15 :
                        Item == 3 ? 20 : 0;
                
    set_user_health(id, get_user_health(id) + iHealthAmount);
    
    menu_destroy(iMenu);
} 
И това е напълно валидно и работи.

Също може да се използва и при return, ето и пример:

Код за потвърждение: Избери целия код

public cmdSayChat(id)
{
    if(isUserGaGed[id]) 
    {
        return PLUGIN_HANDLED;
    }
    
    return PLUGIN_CONTINUE;
} 
=>

Код за потвърждение: Избери целия код

public cmdSayChat(id)
{
    return isUserGaGed[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
} 
Често срещани грешки при използването на тернарен оператор са:
- типът данни на вярната стойност не съответства на грешната (т.е. е пробвано да се направи нещо от типа на
new iTest = is_user_alive(id) ? 1 : "pesho";, което е ГРЕШНО)
- не е използван inline, a като собствена конструкция
- използвани са placeholders в стойностите (%s, %d, %c, %i, %f, %x)

Възможно е да не съм успял да обясня както трябва нещата или да съм пропуснал нещо, така че питайте.

Обратно към “Полезни кодове/уроци”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 8 госта