000103. Типы данных в C#. Базовые операции над ними.
Типы данных в C#. Базовые операции над ними.|В этом уроке Вы узнаете о базовых типах данных в C#, которые справедливы и для скриптинга GTA IV.|wmysterio|wmysterio||||Как вчера помню, как писал урок о типах данных в SannyBuilder и вот уже добрался и к GTA 4 :) Если в саннике типов данных было так мало, что на пальцах посчитать можно, то в C# их просто огромное количество! Большинство из них я сам не знаю, поэтому рассмотрим то, что чаще встречаются.
Начнем с целых чисел. Существует большое количество типов, которые могут содержать в себе целые числа. Обычно они отличаются диапазоном значений. Кроме этого, некоторые типы имеют синонимы, чтобы не писать их длинные варианты. Вот некоторые из них:
Тип
Синоним
Размер ( в байтах )
Диапазон значений
System.Byte
byte
1
[0;255]
System.SByte
sbyte
1
[-128;127]
System.Int16
short
2
[-32768;32767]
System.UInt16
ushort
2
[0;65535]
System.Int32
int
4
[-2147483648;2147483647]
System.UInt32
uint
4
[0;4294967295]
System.Int64
long
8
[-9223372036854775808;9223372036854775807]
System.UInt64
ulong
8
[0;18446744073709551615]
Дальше пойдут дробные числа. Есть, как минимум три, часто использующихся типа:
Тип
Синоним
Размер ( в байтах )
Диапазон значений
System.Single
float
4
[5E-45;3.4E+38]
System.Double
double
8
[5E-324;1.7Е+308]
System.Decimal
decimal
16
[1Е-28;7.9Е+28]
Также в C# мы можем хранить как отдельный символ в переменной, так и целую строку. Для этого существуют следующие типы:
Тип
Синоним
Размер ( в байтах )
Диапазон значений
Форма записи
System.Char
char
2
[0;65535]
'D'
System.String
string
4-8 в зависимости от разрядности ОС
-
"my string"
Размер символов, как и диапазон, может варьироваться, в зависимости от выбранной кодировки, но, как правило, этого хватает для большинства языков. В кавычках мы можем указать только 1 символ!
Что касается строк, то они являются ссылочными типами данных, но реализованы как остальные простые типы. Строка являет собой фиксированный набор символов, который собирается из всех символов, помещённых в двойные кавычки. Ограничения на длину строки, как таковую, нет и зависит она по большей мере от достуной оперативной памяти.
Есть ещё очень важный простый логический тип, который чаще всего используется для хранение состояний ( истина / ложь ), а также как выражение для проверки условий:
Тип
Синоним
Размер ( в байтах )
Форма записи
System.Boolean
bool
1
true или false
Здесь важно отметить, что в C# не определено взаимное преобразование логических и целых значений. Например, 1 не преобразуется в значение true, а 0 - в значение false. И на оборот. На этот крючок часто попадаются люди, которые переходят с C/C++, где такое преобразование допускалось, и из за этого возникают некоторые проблемы.
Давайте узнаем как объявлять переменные! Есть много способов. Вот таблица этих вариантов:
Объявление в столбик
Объявление в одну строку
Объявление и присвоение значения переменным
```
cs int a; int b; int c;
</td><td>
cs int a, b, c;
</td><td>
cs int a = 0; int b, c = 36; int d = -5, c = 20;
</td></tr>
</tbody></table>
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
**Примечание:** Если переменные объявлены таким видом: <u>int b, c = 36</u>, то значение <u>36</u> будет присвоено только переменной <u>c</u>, а не всем переменным. Помните об этом!
</div>
Ещё важно упомянуть, что некоторые литералы простых типов имеют дополнительный префикс. Их цель в том, чтобы компилятор знал какой тип данных мы присваиваем. Например, такая запись оповестит нас об ошибке:
cs float x = 20.0; // ошибка float y = 4; // всё ок
Во втором случае мы указали число вовсе без плавающей точки и при этом отработало всё на ура. А вот первый вариант никак не поймёт что мы написали. Суть ошибки в том, что по-умолчанию выражение <u>20.0</u> относится к типу **double**, у которого нет явного преобразования в тип <u>float</u>. Чтобы указать компилятору, что мы хотим использовать именно <u>float</u>, нужно дописать суффикс **F** ( регистр может быть любым ):
cs float x = 20.0F; // всё ок float y = 4F; // тоже работает
На самом деле таких суффиксов достаточно много, но рассматривать их здесь я не буду. Вы уже можете найти их самостоятельно. Ещё одна особенность литералов в способе написания дробных чисел, например: <u>0.0001F</u>. C# позволяет нам пропускать первое число до точки, в результате мы можем увидеть и такую запись:
cs float x = .0001F;
Далее рассмотрим операции над типами, которые существуют в C#. Если в SannyBuilder все операции нумеровались ( опкоды ) и сам скриптовый язык был низкоуровневым, то C# позволяет делать огромное количество операций, комбинируя их.
Все операции можно разделить на несколько типов. Обычно за операции отвечают так называемые операторы. Они применяются не только для базовых типов и могут нести дополнительную логику при использовании оператора ( не обязательно выполняя ту операцию, символ которого используется ):
- Арифметические операторы:
<table class="table table-bordered"><tbody>
<tr><th>Оператор</th><th>Действие</th></tr>
<tr><td>+</td><td>Сложение</td></tr>
<tr><td>-</td><td>Вычитание, унарный минус</td></tr>
<tr><td>*</td><td>Умножение</td></tr>
<tr><td>/</td><td>Деление</td></tr>
<tr><td>%</td><td>Деление по модулю</td></tr>
<tr><td>--</td><td>Декремент</td></tr>
<tr><td>++</td><td>Инкремент</td></tr>
</tbody></table>
- Операторы отношения, ( означает взаимосвязь, которая может существовать между двумя значениями ):
<table class="table table-bordered"><tbody>
<tr><th>Оператор</th><th>Действие</th></tr>
<tr><td>==</td><td>Равно</td></tr>
<tr><td>!=</td><td>Не равно</td></tr>
<tr><td>></td><td>Больше</td></tr>
<tr><td><</td><td>Меньше</td></tr>
<tr><td>>=</td><td>Больше или равно</td></tr>
<tr><td><=</td><td>Меньше или равно</td></tr>
</tbody></table>
- Логические операторы ( взаимосвязь между логическими значениями "истина" и "ложь" ):
<table class="table table-bordered"><tbody>
<tr><th>Оператор</th><th>Действие</th></tr>
<tr><td>&</td><td>И</td></tr>
<tr><td>\|</td><td>ИЛИ</td></tr>
<tr><td>^</td><td>Исключающее ИЛИ</td></tr>
<tr><td>&&</td><td>Укороченное И</td></tr>
<tr><td>\|\|</td><td>Укороченное ИЛИ</td></tr>
<tr><td>!</td><td>НЕ</td></tr>
</tbody></table>
- Операторы присваивания:
<table class="table table-bordered"><tbody>
<tr><th>Оператор</th><th>Аналог</th></tr>
<tr><td>+= </td><td>x = x + 1;</td></tr>
<tr><td>-= </td><td>x = x - 1;</td></tr>
<tr><td>*=</td><td>x = x * 1;</td></tr>
<tr><td>/=</td><td>x = x / 1;</td></tr>
<tr><td>%=</td><td>x = x % 1;</td></tr>
<tr><td>\|=</td><td>x = x \| 1;</td></tr>
<tr><td>^=</td><td>x = x ^ 1;</td></tr>
</tbody></table>
- Поразрядные операторы:
<table class="table table-bordered"><tbody>
<tr><th>Оператор</th><th>Действие</th></tr>
<tr><td>&</td><td>Поразрядное И</td></tr>
<tr><td>\|</td><td>Поразрядное ИЛИ</td></tr>
<tr><td>^</td><td>Порязрядное исключающее ИЛИ</td></tr>
<tr><td><<</td><td>Сдвиг влево</td></tr>
<tr><td>>></td><td>Сдвиг вправо</td></tr>
<tr><td>~</td><td>Дополнение до 1 ( унарный оператор НЕ )</td></tr>
</tbody></table>
Как мы видим, некоторые операторы могут использоваться в разных целях, в зависимости где их применяют. В одном случае он может быть логическим - в другом: поразрядным. В любом случае, для написания скриптов для GTA IV большинство операторов будет не нужно.
Примеров может быть уйма, я написал самый простой:
cs int a; a = (25 + 65)*2; a /= 5;
Объявляем переменную типа int. Дальше идут операции над ней. Проблемы, думаю, могут возникнут у того, кто не дружил с математикой в детстве(или сейчас).
Язык C# действует по тому же принципу, что и математика. Сначала выбирается приоритет выполнения операций. В нашем случаи сначала будут выполнятся операции в скобках: 25+65=90. Дальше идёт умножение: 90*2=180. Этот результат записывается в переменную <u>a</u>. Следующая операция: идёт деление на 5. Принцип тот же, что и у SannyBuilder. Переменная делит своё значение на выражение и записывает результат в себя. Следовательно, 180/5=36.
Другие операции будем рассматривать по-необходимости. Сейчас нет смысла нагружать вас этим :)|866|1|0||tipy_dannykh_v_csharpe_operacii_nad_nimi|1511732572