А тем кто не понимал в чем отличие, наверное будет полезно прочитать данную статью.
Оба рассматриваемых оператора создают переменную, но у них существует определенная разница.
Оператор NEW
Для начала давайте рассмотрим оператор new на примере вот такой функции:
public func_new(){// Какая то функция
new i // создание переменной
server_print("i=%d",i) // вывод значения переменной
i++ // прибавляем 1 к переменной
server_print("i+1 i=%d",i)//выводим переменную с +1
}
Если вызвать данную функцию два раза подряд, то результат будет такой:
cmd_new
i=0
i+1 i=1
cmd_new
i=0
i+1 i=1
i=0
i+1 i=1
cmd_new
i=0
i+1 i=1
cmd_new - Это команда вызывающая функцию func_new.
Как видно результат одинаковый, это потому что оператор new создает переменную в памяти каждый раз при объявлении, то есть старая была уничтожена.
Оператор Static
Если в данном коде заменить оператор new на static то получится вот такой код:
public func_static(){//Другая функция
static i// заменили new на static
server_print("i=%d",i)
i++
server_print("i+1 i=%d",i)
}
И результат работы уже будет такой:
cmd_static
i=0
i+1 i=1
cmd_static
i=1
i+1 i=2
i=0
i+1 i=1
cmd_static
i=1
i+1 i=2
Как видно из результата - переменная сохранила свое значение, так как оператор static не пересоздает переменную, а продолжает работать с ране созданной.
Логично предположить что многие сразу скажут - " Так это же обычная глобальная переменная", но это не так, глобальная переменная доступна везде, а переменная созданная с помощью static внутри какой то функции, будет доступна только там.
Static - рекомендуется использовать там, где происходит очень частое использование.
Рабочий пример:
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "[http://amxxmodx.ru] New VS Static"
#define VERSION "1.0"
#define AUTHOR "Admin"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_concmd("cmd_new","func_new")
register_concmd("cmd_static","func_static")
register_concmd("cmd_vs","func_vs")
}
public func_new(){
new i
server_print("i=%d",i)
i++
server_print("i+1 i=%d",i)
}
public func_static(){
static i
server_print("i=%d",i)
i++
server_print("i+1 i=%d",i)
}
В примере нет глобальных переменных, но в функции func_static переменная будет сохранять свое значение. И это не глобальная переменная, кто не верит, попробуйте создать третью функцию и обратиться к переменной i.