13:48
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
        
[Include] RemoveBuilding (2)
JasonGordon 24.05.2017 23:48
[SA-MP] Hosted Tab (116)
DieSeL 17.05.2017 17:33
Физрук (15)
Lanablogger1 16.05.2017 16:00
 





Рекомендуем:
Добавить IP: 95.172.59.51:7777





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
Скачать GTA SAMP 0.3.7 - Кл... 20.07.2015
Страница 1 из 3123»
Модератор форума: Dima-kun 
Форум SAMP о мультиплеерах для GTA. »   » Wiki-Samp-Rus » [ Lesson ] Операторы в PAWN.
[ Lesson ] Операторы в PAWN.
LatronДата: Понедельник, 06.02.2012, 14:21 | Сообщение # 1
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
Автор урока: Latron

Всем привет,сегодня расскажу вам что такое операторы...

Отношения:


== - равно. Пример if( 1 == 1 ) - проверяет: равен ли один одному.
!= - не равно. Пример if( 2 != 1 ) - проверяет равна ли единица двум.
>= - больше либо равно. Пример if( 1 >= 2 ) - проверяет: больше ли или равна единица двум.
<= - меньше либо равно. Пример if( 1 <= 1 ) - проверяет: меньше ли или равен один одному.
> - больше. Пример if( 2 > 1 ) - проверяет больше ли два чем единица.
< - меньше. Пример if( 1 < 2 ) - проверяет меньше ли единица чем два.


Вычислительные операторы:


+ - сложение. Пример new var = 7 + 14; . Значение переменной var будет равно 21.
- - вычитание. Пример new var = 14 - 7; . Значение переменной var будет равно 7.
* - умножение. Пример new var = 7 * 3; . Значение переменной var будет равно 21.
/ - деление. Пример new var = 21 / 3; . Значение переменной var будет равно 7.
% - деление с остатком. Пример new var = 5 % 3; . Значение переменной var будет равно 1.


Логические операторы:


|| - Или. Пример if( 1 == 1 || 2 == 2 ) Условие: если единица равна единице ИЛИ два равно двум.
&& - И. Пример if( 1 == 1 && 2 == 2 ) Условие: если единица равна единице И два равно двум,только в этом случае оно сработает.
! - Нет. Пример if( !IsPlayerConnected( playerid ) ) Условие: если игрок не подключен к серверу.
= - Присвоение var = 333; . Присвоит var значение 333.
+= - Прибавление var += 333; . Прибавит к var 333.
-= - Вычитание var -= 333; . Вычтет из var 333.

В PAWN есть два нестандартных оператора, предназначенных для увеличения и уменьшения переменных. Оператор инкремента ++ добавляет 1 к своему операнду, а оператор декремента -- вычитает 1.
Нестандартность операторов ++ и -- в том, что их можно использовать и как префиксные (помещая перед переменной: ++var), и как постфиксные (помещая после переменной: var++) операторы. В обоих случаях значение n увеличивается на 1, но выражение ++var увеличивает var до того, как её значение будет использовано, а var++ - после того.

++ - Оператор инкремента.
new var = 2;
var++; увеличит значение var на единицу.

-- - Оператор инкремента.
new var = 2;
var--; уменьшит значение var на единицу.


Побитовые операторы:
( Спасибо toneysix )

& - побитовое И
| - побитовое ИЛИ
^ - побитовое исключающее ИЛИ.
<< - сдвиг влево.
>> - сдвиг вправо.
~ - побитовое отрицание (унарный).

Оператор & (побитовое И) часто используется для обнуления некоторой группы разрядов. Например

var = var & 0177;

обнуляет в var все разряды, кроме младших семи.

Оператор | (побитовое ИЛИ) применяют для установки разрядов; так,

var2 = var2 | SET_ON;
устанавливает единицы в тех разрядах var, которым соответствуют единицы в SET_ON.

Оператор ^ (побитовое исключающее ИЛИ) в каждом разряде установит 1, если соответствующие разряды операндов имеют различные значения, и 0, когда они совпадают.

Поразрядные операторы & и | следует отличать от логических операторов && и ||, которые при вычислении слева направо дают значение истинности. Например, если var равно 1, а var2 равно 2, то var & var2 даст нуль, а var && var2 - единицу.

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

Унарный оператор ~ поразрядно "обращает” целое т. е. превращает каждый единичный бит в нулевой и наоборот. Например
var = var & ~077
обнуляет в var последние 6 разрядов. Заметим, что запись var & ~077 не зависит от длины слова, и, следовательно, она лучше, чем var & 0177700, поскольку последняя подразумевает, что var занимает 16 битов. Не зависимая от машины форма записи ~077 не потребует дополнительных затрат при счете, так как ~077 - константное выражение, которое будет вычислено во время компиляции.

Дополнение от ZiGGi
Это может пригодиться для существенной экономии памяти. Например вам доступен 1 байт памяти и вам надо записать 2 числа в пределах 0..15. То вы с лёгкостью можете записать их в 1 байт.
Code
new x[1 char]; // создаём массив с 1 ячейкой размерностью в 1 байт
// запишем число 13 в правые 4 бита и цифру 6 в левые 4 бита
// 13 = 1101 (bin)
// 6 = 110 (bin)
x[0] = ((6 << 4)|(13)); // сдвигаем 3 бита цифры 6 в левую часть байта и ставим 4 бита числа 13 в правые 4 бита
// здесь рекомендуется сделать защиту "от дурака", который может
// попытаться записать в правую часть число размером более 4 битов
// делается это так: x = ((6 << 4)|(13 & 15));
// т.к. 15 == 1111 (bin), то мы обнуляем все биты, за этими пределами


После выполнения, x будет равняться 1101101 (bin).
Записали, теперь надо извлечь:
Code
printf("6 = %d",x[0] >> 4); // смещаем вправо на 4 бита, т.к. число 6 у нас в левой части байта
printf("13 = %d",x[0] & 15); // обнуляем левую часть байта, путём применения логической операции И(в математике её действие идентично умножению)



Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )




Улыбайся всем как можно шире - =)) Они должны быть уверены,что ты холодная лицемерная сволочь. © Виктор Пелевин

Сообщение отредактировал Latron - Воскресенье, 11.03.2012, 12:30
AlcoholikДата: Понедельник, 06.02.2012, 14:50 | Сообщение # 2
Группа: Администратор
Сообщений: 8284
Награды: 111
Город: Санкт-Петербург
Репутация: 5945
Статус:
Какой это уже по счёту урок по операторам?


if(isset($beer)&&isset($girl)) { drink($beer);fuck($girl); }else die();
Мониторинг sa:mp серверов


Приватно никого не консультирую, моды также не пишу, ни так, ни за деньги.
Моя ICQ 675715, пишу только с неё. Все остальные Роачи фейки, ничего я не продаю и продавать не буду, вас разводят.
LatronДата: Понедельник, 06.02.2012, 14:53 | Сообщение # 3
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
RoACh, ну не такие подробные...


Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )




Улыбайся всем как можно шире - =)) Они должны быть уверены,что ты холодная лицемерная сволочь. © Виктор Пелевин
psychoДата: Понедельник, 06.02.2012, 15:00 | Сообщение # 4
16 | 13
Группа: I'm V.I.P.
Сообщений: 327
Награды: 11
Репутация: 645
Замечания: 20%
Статус:
Неплохо,поставлю "Спасибо" за старания. :) :)
BorogДата: Понедельник, 06.02.2012, 15:21 | Сообщение # 5
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1362
Награды: 43
Город: Москва
Репутация: 1249
Замечания: 20%
Статус:
Что за разряды из "побитых операторов"? Поясни пжлс


Silver Break
http://s-break.ru/
http://vk.com/sbreak
LatronДата: Понедельник, 06.02.2012, 15:29 | Сообщение # 6
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
Borog, Побитовые операторы работают с двоичным представлением позиционной системы счисления.


Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )




Улыбайся всем как можно шире - =)) Они должны быть уверены,что ты холодная лицемерная сволочь. © Виктор Пелевин

Сообщение отредактировал Latron - Понедельник, 06.02.2012, 15:36
BorogДата: Понедельник, 06.02.2012, 15:43 | Сообщение # 7
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1362
Награды: 43
Город: Москва
Репутация: 1249
Замечания: 20%
Статус:
Latron, А как это отвечает на мой вопрос? :)


Silver Break
http://s-break.ru/
http://vk.com/sbreak
ZiGGiДата: Понедельник, 06.02.2012, 17:48 | Сообщение # 8
Мастер джэдай
Группа: Продвинутые
Сообщений: 2651
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
Quote (Borog)
Что за разряды из "побитых операторов"? Поясни пжлс

разряд == бит



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]
LatronДата: Понедельник, 06.02.2012, 18:05 | Сообщение # 9
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
Borog, ну зигги то ты точно должен понять )понял ведь?


Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )




Улыбайся всем как можно шире - =)) Они должны быть уверены,что ты холодная лицемерная сволочь. © Виктор Пелевин
BorogДата: Понедельник, 06.02.2012, 23:09 | Сообщение # 10
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1362
Награды: 43
Город: Москва
Репутация: 1249
Замечания: 20%
Статус:
Спасибо, ZiGGi
Но вот как это на практике поможет - для меня загадка :)



Silver Break
http://s-break.ru/
http://vk.com/sbreak
ZiGGiДата: Понедельник, 06.02.2012, 23:32 | Сообщение # 11
Мастер джэдай
Группа: Продвинутые
Сообщений: 2651
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
Quote (Borog)
Но вот как это на практике поможет - для меня загадка

Т.к. эта статья не очень, я написал свою, вот вырезка из неё:

Где это может реально пригодиться?

Это может пригодиться для существенной экономии памяти. Например вам доступен 1 байт памяти и вам надо записать 2 числа в пределах 0..15. То вы с лёгкостью можете записать их в 1 байт.

Code
new x[1 char]; // создаём массив с 1 ячейкой размерностью в 1 байт
// запишем число 13 в правые 4 бита и цифру 6 в левые 4 бита
// 13 = 1101 (bin)
// 6 = 110 (bin)
x[0] = ((6 << 4)|(13)); // сдвигаем 3 бита цифры 6 в левую часть байта и ставим 4 бита числа 13 в правые 4 бита
// здесь рекомендуется сделать защиту "от дурака", который может
// попытаться записать в правую часть число размером более 4 битов
// делается это так: x = ((6 << 4)|(13 & 15));
// т.к. 15 == 1111 (bin), то мы обнуляем все биты, за этими пределами

После выполнения, x будет равняться 1101101 (bin).
Записали, теперь надо извлечь:
Code
printf("6 = %d",x[0] >> 4); // смещаем вправо на 4 бита, т.к. число 6 у нас в левой части байта
printf("13 = %d",x[0] & 15); // обнуляем левую часть байта, путём применения логической операции И(в математике её действие идентично умножению)



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]
RockmanДата: Понедельник, 06.02.2012, 23:44 | Сообщение # 12
Постоялец
Группа: Продвинутые
Сообщений: 430
Награды: 4
Город: Нижний Новгород
Репутация: 474
Замечания: 0%
Статус:
Единственные применения, которые я находил битовым операциям, это быстрая выборка по каким либо наборам.
Была такая задача однажды, проверять положение элемента в ячейке, так вот двоичные наборы типа:
0000
0001
0010
0100
1000


Помогали быстро проверять необходимые условия. А так же использовал битовый сдвиг влево, что бы ускорить умножение на 2 и вправо, что бы ускорить деление на 2, но это только задания были, не думаю, что на практике очень часто требуется использовать именно их, тем более в pawn. Хотя битовые операции очень часто используются в криптографии, ну то есть в шифровании.

Добавлено (06.02.2012, 23:44)
---------------------------------------------
Ах да, насчет экономии памяти, лучше сэкономить время и строки кода, чем таким образом экономить эти биты, тем более на нынешних то машинах.

ZiGGiДата: Понедельник, 06.02.2012, 23:51 | Сообщение # 13
Мастер джэдай
Группа: Продвинутые
Сообщений: 2651
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
Quote (Rockman)
Ах да, насчет экономии памяти, лучше сэкономить время и строки кода, чем таким образом экономить эти биты, тем более на нынешних то машинах.

Вот поэтому когда с каждым днём увеличивается память, мы не замечаем её увеличения:).



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]
RockmanДата: Вторник, 07.02.2012, 00:40 | Сообщение # 14
Постоялец
Группа: Продвинутые
Сообщений: 430
Награды: 4
Город: Нижний Новгород
Репутация: 474
Замечания: 0%
Статус:
Quote (ZiGGi)
Вот поэтому когда с каждым днём увеличивается память, мы не замечаем её увеличения:).


Речь идет об оперативной памяти. Скажем, у вас на сервере 2048 мб ОЗУ, она не увеличивается с каждым днем, то время, которое будешь тратить на экономию памяти таким образом, разумнее потратить на оптимизацию кода. Динамически выделять память под массивы, использовать подобие кэша и т.д Уменьшение расхода ОЗУ будет заметнее.

LatronДата: Вторник, 07.02.2012, 01:51 | Сообщение # 15
Группа: I'm V.I.P.
Сообщений: 2115
Награды: 22
Город: Орел
Репутация: 1604
Замечания: 0%
Статус:
ZiGGi, спасибо,я дополнил урок)


Моё портфолио

Мои работы:
[ Lesson ] Операторы в PAWN.
[ Lesson ] Переменная.
[ GM ] RegSys. ( Last update: 21.04.2012 )




Улыбайся всем как можно шире - =)) Они должны быть уверены,что ты холодная лицемерная сволочь. © Виктор Пелевин
Форум SAMP о мультиплеерах для GTA. »   » Wiki-Samp-Rus » [ Lesson ] Операторы в PAWN.
Страница 1 из 3123»
Поиск:





 


 


 
Хостинг от uCoz SAMP-RUS.COM