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 | | |
Last modified 1yr ago