ОПЕРАТОРЫ ЯЗЫКОВ С/С++ и С#
Цель работы: составление алгоритмов и программ разветвленной и циклической структуры на С/С++ и С# с использованием простых типов, явного и неявного преобразования типов.
Код на С/С++ и C# представлен последовательностью операторов, оканчивающихся ; .
Пробельные символы игнорируются компилятором, поэтому удобно писать 1 оператор в строке, делать отступы и пропускать строки. Т.е. стиль программирования не страдает.
Программа обладает блочной структурой, скобки { } отмечают начало и конец блока, который может содержать 0 или более операторов. В С# { } не сопровождается ; .
Блоки могут быть вложенными
{
<строка1 кода>;
{
<строка2 кода>;
<строка3 кода>;
}
<строка4 кода>;
}
Для записи комментариев используются /* */, // , /// .
Переменные отличаются по своему типу. Для объявления переменных используется запись
<тип> <имя>;
<тип> <список имен>;
Одновременно с объявлением можно проводить инициализацию. Переменные создаются не при объявлении, а при инициализации. Для задания имени переменной пользуются правилами:
1-й символ обязательно буква, или _ , или @ (только для C#);
2-й и последующие символы – буквы, цифры, знак _ ;
имена переменных не должны совпадать с ключевыми словами;
компилятор чувствителен к регистру.
Для выбора имен можно пользоваться соглашениями:
венгерской нотацией (szString1);
нотацией PascalCase (MyVar);
нотацией camelCase (myVar).
Рассмотрим дальнейшие правила, относящиеся к языку С#, как более легкому для самостоятельного изучения. В дальнейшем, имея опыт программирования на С#, можно быстрее освоить языки С/С++, тем более, что он изначально поддерживает объектно-ориентированный стиль.
Система типов имеет принципиальный характер, согласно которой в С# все типы можно разделить на 4 категории:
- типы-значения (value) или значимые типы;
- ссылочные (reference).;
- указатели (pointer);
- тип void.
Классификация основана на том, где и как хранятся значения типов. Для ссылочного типа значение задает ссылку на область памяти в "куче", где расположен соответствующий объект. Для значимого типа используется прямая адресация, значение хранит собственно данные, и память для них отводится, как правило, в стеке. Указатели могут использоваться только в небезопасных блоках, помеченных как unsafe. Тип void указывает на отсутствие какого-либо значения. В языке C# к значимым типам относятся: логический, арифметический, структуры, перечисление. Массивы, строки и классы относятся к ссылочным типам.
В C# массивы рассматриваются как динамические, их размер может определяться на этапе вычислений, а не в момент трансляции. Строки могут менять свою длину. Структуры C#, также и как и в С++, представляют частный случай класса. Определив свой класс как структуру, программист получает возможность отнести класс к значимым типам.
Также типы делятся на встроенные и определенные пользователем. Встроенные типы фактически совпадают с системными типами каркаса .Net Framework из пространства имен System.
Таблица 1
Логический тип |
||||
Имя типа |
Системный тип |
Значения |
Размер |
|
bool |
System.Boolean |
true, false |
8 бит |
|
Арифметические целочисленные типы |
||||
Имя типа |
Системный тип |
Диапазон |
Размер |
|
sbyte |
System.SByte |
-128 — 128 |
Знаковое, 8 Бит |
|
byte |
System.Byte |
0 — 255 |
Беззнаковое, 8 Бит |
|
short |
System.Short |
-32768 —32767 |
Знаковое, 16 Бит |
|
ushort |
System.UShort |
0 — 65535 |
Беззнаковое, 16 Бит |
|
int |
System.Int32 |
≈(-2*10^9 — 2*10^9) |
Знаковое, 32 Бит |
|
uint |
System.UInt32 |
≈(0 — 4*10^9) |
Беззнаковое, 32 Бит |
|
long |
System.Int64 |
≈(-9*10^18 — 9*10^18) |
Знаковое, 64 Бит |
|
ulong |
System.UInt64 |
≈(0— 18*10^18) |
Беззнаковое, 64 Бит |
|
Арифметический тип с плавающей точкой |
||||
Имя типа |
Системный тип |
Диапазон |
Точность |
|
float |
System.Single |
+1.5*10^-45 - +3.4*10^38 |
7 цифр |
|
double |
System.Double |
+5.0*10^-324 - +1.7*10^308 |
15-16 цифр |
|
Арифметический тип с фиксированной точкой |
||||
Имя типа |
Системный тип |
Диапазон |
Точность |
|
decimal |
System.Decimal |
+1.0*10^-28 - +7.9*10^28 |
28-29 значащих цифр |
|
Символьные типы |
||||
Имя типа |
Системный тип |
Диапазон |
Точность |
|
char |
System.Char |
U+0000 - U+ffff |
16 бит Unicode символ |
|
string |
System.String |
Строка из символов Unicode |
||
Объектный тип |
||||
Имя типа |
Системный тип |
Примечание |
||
object |
System.Object |
Прародитель всех встроенных и пользовательских типов |
||
Константы C# могут появляться в виде литералов и именованных констант. Например:
y = 7.7f;
Значение константы "7.7f" является одновременно ее именем, оно же позволяет однозначно определить тип константы. В примере добавляется суффикс - специальный символ для точного указания типа. Примеры литеральных констант:
bool sw1=true, sw2=false; //нельзя присвоить 0 или 1
byte myByte=23;
sbyte mySByte=-5;
short myShort=34;
ushort myUShort=234;
int myInt=-453;
uint myUint=10u; // u или U
long myLong=1523L; // l можно спутать с 1
ulong myUlong1=564ul,
myUlong2=435Lu; // в любом порядке
decimal myDec=123.4m; // или М
float myFloat=234.5f; // или F
double myDoub1=34.56,
myDoub2=45.32d; // или D
char myChar='a'; // или Esc-последовательность
string myString1="Проба\nПера", // обычная строка
myString2=@"На
нескольких
строках"; // дословная строка, удобная для записи пути
Таблица 2
Esc-последовательность |
Выводимый символ |
Код символа в Unicode |
\’ |
Одиночная кавычка |
\x0027 |
\” |
Двойная кавычка |
\x0022 |
\\ |
Обратный слэш |
\x005C |
\0 |
Null |
\x0000 |
\a |
Тревога (звуковой сигнал) |
\x0007 |
\b |
backspace |
\x0008 |
\f |
Начать новую страницу |
\x000C |
\n |
Новая строка |
\x000A |
\r |
Возврат каретки |
\x000D |
\t |
Горизонтальная табуляция |
\x0009 |
\v |
Вертикальная табуляция |
\x000B |
\u |
Символ Unicode |
\xNNNN |
В объявлении константы добавляется модификатор const, инициализация констант обязательна и не может быть отложена.
Инициализирующее выражение может быть сложным, важно, чтобы оно могло быть вычислено в момент его определения.
public void Constants()
{
const int smallSize = 38, largeSize =58;
const int midSize = (smallSize + largeSize)/2;
const double pi = 3.141593;
largeSize = 60; //Ошибка!!!!!!!!! Значение константы нельзя изменить.
Console.WriteLine("midSize= {0}; pi={1}", midSize, pi);
}
Рассмотрим пример, демонстрирующий спецификаторы формата при выводе на консоль.
static void Main(string[] args)
{
string myStr=@"Вывод
с различными параметрами форматирования
переменной float=1054.4567f";
Console.WriteLine(myStr);
Операции в C#, их приоритет и порядок унаследованы из языка C++.
При вычислении выражения определяется его значение и тип по типам операндов, входящих в выражение.
В табл. 3 операции перечислены по строкам в порядке убывания приоритетов.
Таблица 3
Прио-ритет |
Категория |
Операции |
Порядок |
0 |
Первичные |
(expr) x.y f(x) a[x] x++ x-- new sizeof(t) typeof(t) checked(expr) unchecked(expr) |
Слева направо |
1 |
Унарные |
+ - ! ~ ++x --x (T)x |
-“- |
2 |
Мультипликативные (Умножение) |
* / % |
-“- |
3 |
Аддитивные (Сложение) |
+ - |
-“- |
4 |
Сдвиг |
<< >> |
-“- |
5 |
Отношения, проверка типов |
< > <= >= is as |
-“- |
6 |
Эквивалентность |
== != |
-“- |
7 |
Логическое |
& |
-“- |
8 |
Логическое исключающее ИЛИ (XOR) |
^ |
-“- |
9 |
Логическое ИЛИ (OR) |
| |
-“- |
10 |
Условное И |
&& |
-“- |
11 |
Условное ИЛИ |
|| |
-“- |
12 |
Условное выражение |
? : |
Справа налево |
13 |
Присваивание |
= *= /= %= += -= <<= >>= &= ^= |= |
-“- |