Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа 1

.pdf
Скачиваний:
26
Добавлен:
25.03.2016
Размер:
1.36 Mб
Скачать

Лабораторная работа N1 Основные понятия языка С# Алфавит и лексемы

В С# используется кодировка символов Unicode.

Кодировка Unicode позволяет представить символы всех существующих алфавитов одновременно, что коренным образом улучшает переносимость текстов. Каждому символу соответствует свой уникальный код. Естественно, что при этом для хранения каждого символа требуется больше памяти. Первые 128 Unicode-символов соответствуют первой части кодовой таблицы ANSI.

Алфавит С# включает:

буквы (латинские и национальных алфавитов) и символ подчеркивания (_) который употребляется наряду с буквами;

цифры;

специальные символы, например +, *, { и &;

пробельные символы (пробел и символы табуляции);

символы перевода строки.

Из символов составляются более крупные строительные блоки: лексемы, директивы препроцессора и комментарии.

Лексема (token) - это минимальная единица языка, имеющая самостоятельный смысл. Существуют следующие виды лексем:

имена (идентификаторы);

ключевые слова;

знаки операций;

разделители;

литералы (константы).

Лексемы языка программирования аналогичны словам естественного языка.

Директивы препроцессора пришли в С# из его предшественника - языка C++. Препроцессором называется предварительная стадия компиляции, на которой формируется окончательный вид исходного текста программы. Например, с помощью директив (инструкций, команд) препроцессора можно включить или выключить из процесса компиляции фрагменты кода.

Комментарии предназначены для записи пояснений к программе и формирования документации. Из лексем составляются выражения и операторы.

Выражение задает правило вычисления некоторого значения. Например, выражение а+b задает правило вычисления суммы двух величин.

ПРИМЕЧАНИЕ———————————————————————————————

Компилятор выполняет перевод программы в исполняемый файл на языке IL за две последовательные фразы: лексического и синтаксического анализа. При лексическом анализе из потока символов, составляющих исходный текст программы, выделяются лексемы (по другим лексемам, разделителям, пробельным символам и переводам строки). На этапе синтаксического анализа программа переводится в исполняемый код. Кроме того, компилятор формирует сообщения о синтаксических ошибках.

Оператор задаѐт законченное описание некоторого действия, данных или элемента программы. Например: int a; // это – оператор описания целочисленной переменной а.

Идентификаторы

Имена в программах служат той же цели, что и имена в мире людей, - чтобы обращаться к программным объектам и различать их, то есть идентифицировать. Поэтому имена также называют идентификаторами. В идентификаторе могут использоваться буквы, цифры и символ подчѐркивания. Прописные и строчные буквы различаются, например, sysop, SySoP, SYSOP – три разных имени.

Первым символом идентификатора может быть буква или знак подчѐркивания, но не цифра. Длина идентификатора не ограничена. Пробелы внутри имѐн не допускаются. В идентификаторах C# разрешается использовать помимо латинских букв буквы национальных алфавитов. Например, Вася является правильным идентификатором. Более того, в идентификаторах можно применять даже так называемые escape-последовательности Unicode, то есть представлять символ с помощью его кода в шестнадцатеричном виде с префиксом \u, например, \u00F2.

ПРИМЕЧАНИЕ———————————————————————————————

Примеры неправильных имѐн: 2late, Big gig, Б#г; первое начинается с цифры, второе и третье содержат недопустимые символы (пробел и #).

Имена даются элементам программы, к которым требуется обращаться: переменным, типам, константам, методам, меткам и т.д., после этого его можно использовать в последующих операторах программы. При выборе идентификатора необходимо иметь в виду следующее:

идентификатор не должен совпадать с ключевыми словами;

не рекомендуется начинать идентификаторы с двух символов подчѐркивания, поскольку такие имена зарезервированы для служебного использования.

Ключевые слова

Ключевые слова - это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Список ключевых слов С# приведен в таблице 2.1.

Знаки операций и разделители

Знак операции — это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Например, в выражении а+=b знак += является знаком операции, а а и b — операндами. Символы, составляющие знак операций, могут быть как специальными, например, &&, | и <, так и буквенными, такими как as или new.

Операции делятся на унарные, бинарные и тернарную по количеству участвующих в них операндов. Один и тот же знак может интерпретироваться по-разному в зависимости от контекста. Все знаки операций, за исключением [ ], ( ) и ? :, представляют собой отдельные лексемы.

Таблица 2.1 - Ключевые слова С#

break

foreach

private

while

checked

int

return

abstract

default

long

stackalloc

byte

ehum

operator

this

class

finally

protected

uint

delegate

goto

sbyte

using as

event

interface

static

case

fixed

namespace

throw

const

if

out

ulong

do

internal

public

virtual

explicit

new

sealed

 

float

override

string

base

implicit

readonly

true

catch

is

short

unchecked

continue

null

struct

void.bool

double

params

try

char

extern

ref

unsafe

decimal

for

sizeof

volatile

else

in

switch

 

false

lock

typeof

 

 

object

ushort

 

Разделители используются для разделения или, наоборот, группирования элементов. Примеры разделителей: скобки, точка, запятая. Ниже перечислены все знаки операций и разделители, использующиеся в С#:

{ } [ ] ( ) . , : ; + - * / % & | ^ ! ~ = < > ? ++ -- && << >> == != <= >= += -= *= /= %= &= |= ^= <<= >>= ->

Литералы Литералами, или константами, называют неизменяемые величины. В С# есть логические,

целые, вещественные, символьные и строковые константы, а также константа null. Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов данных по ее внешнему виду. Описание и примеры констант каждого типа приведены в таблице 2.2.

Таблица 2.2 - Константы С#

Константа

Описание

Примеры

Логическая

Целая

Вещественная

Символьная

Строковая

Константа null

True (истина) false (ложь)

Десятичная: последовательность десятичных цифр (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), за которой может следовать суффикс (U, u, L, l, UL, Ul, uL, ul, LU, Lu, lU, lu)

Шестнадцатеричная: символы 0x или 0X, за которыми следуют шестнадцатеричные цифры

(0,1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, Е, F), а за цифрами, в свою очередь, может следовать суффикс (U, u, L, l, UL, Ul, uL, ul, LU, Lu, lU, lu)

Сфиксированной точкой:

*цифры+*.+*цифры+*суффикс+

Суффикс - один из символов F, f, D,d, М, m

Спорядком:

[цифры][.][цифры]{E|e}[+|-][цифры][суффикс] Суффикс – один из символов F, f, D, d, M, m

Символ, заключённый в апострофы

Последовательность символов, заключённая в кавычки

Ссылка, которая не указывает ни на какой объект

True false

8

0

199226

8u

0Lu 199226L

0хА 0xlB8 0X00FF 0xAU 0xlB8LU 0X00FFl

5.7 .001 35

5.7F .001d 35

5F .001f 35m

0.2E6 .11e+3 5E-10 0.2E6D .11e-3

5E10

‘A’ ‘ю’ ‘*’ ‘\0’ ‘\n’ ‘xF’ ‘\x74’ ‘\uA81B’

“Здесь была Vasia”

“\tЗначение r=\xF5 \n”

“Здесь был

\u0056\u0061” “C:\\temp\\file1.txt“

Рассмотрим литералы, представленные в таблице. 2.2 более подробно.

Логических литералов всего два. Они широко используются в качестве признаков наличия или отсутствия чего-либо.

Целые литералы могут быть представлены либо в десятичной, либо в шестнадцатеричной системе счисления, а вещественные — только в десятичной системе, но в двух формах: с фиксированной точкой и с порядком. Вещественная константа c порядком представляется в виде мантиссы и порядка. Мантисса записывается слева от знака экспоненты (Е или е), порядок — справа от знака. Значение константы определяется как произведение мантиссы и возведенного в указанную в порядке степень числа 10 (например, 1.3е2 = 1,3*102 = 130). При записи вещественного числа могут быть опущены либо целая часть, либо дробная, но, конечно, не обе сразу.

ПРИМЕЧАНИЕ ————————————————————————————————

Пробелы внутри числа не допускаются. Для отделения целой части от дробной используется не запятая, а точка. Символ Е не представляет собой знакомое всем из математики число е, а указывает, что далее располагается степень, в которую нужно возвести число 10.

Если требуется сформировать отрицательную целую или вещественную константу, то перед ней ставится знак унарной операции изменения знака (-), например:

-218, -022, -0хЗС, -4.8, -0.1е4.

Когда компилятор распознает константу, он отводит ей место в памяти в соответствии с ее видом и значением. Если по каким-либо причинам требуется явным образом задать, сколько памяти следует отвести под константу, используются суффиксы, описания которых приведены в таблице

2.3.

Таблица 2.3 - Суффиксы целых и вещественных констант

Суффикс

Значение

L, l

Длинное целое (long)

U, u

Беззнаковое целое (unsigned)

F, f

Вещественное с одинарной точностью (float)

D, d

Вещественное с двойной точностью (doublе)

M, m

Финансовое десятичного типа (decimal)

Символьная константа представляет собой любой символ в кодировке Unicode. Символьные константы записываются в одной из четырех форм, представленных в таблице 2.2:

«обычный» символ, имеющий графическое представление (кроме апострофа и символа перевода строки) - ' А', ' ю', ' *';

управляющая последовательность – '\0', ' \n';

- символ в виде шестнадцатеричного кода — '\xF', '\х74';

- символ в виде escape-последовательности Unicode — ' \uA81B'.

Управляющей последовательностью, или простой escape-последовательностью,

называют определенный символ, предваряемый обратной косой чертой. Управляющая последовательность интерпретируется как одиночный символ и используется для представления:

кодов, не имеющих графического изображения (например, \n — переход в начало следующей строки);

символов, имеющих специальное значение в строковых и символьных литералах, например, апострофа '.

Втаблице 2.4 приведены допустимые значения последовательностей. Если непосредственно за обратной косой чертой следует символ, не предусмотренный таблицей, возникает ошибка компиляции.

Таблица 2.4 Управляющие последовательности С#

\a-звуковой сигнал

\v-вертикальная табуляция

\b-возврат на шаг

\\ - обратная косая черта

\f-перевод страницы (формата)

\’-апостроф

\n-перевод строки

\‖-кавычка

\r-возврат каретки

\0-нуль-символ

\t-горизонтальная табуляция

Символ, представленный в виде шестнадцатеричного кода начинается с префикса \0x, за которым следует код символа.

Escape-последовательности Unicode служат для представления символа с помощью его кода в шестнадцатеричном виде с префиксом \u или \U (например \u00F2, \U00010011).

Управляющие последовательности могут использоваться и в строковых константах, например если требуется вывести несколько строк их объединяют в один литерал, отделив одну строку от другой управляющей последовательность. \n:

“Никто не доволен своей \n внешностью, но каждый доволен \n своим умом”

Если же внутри строки требуется использовать кавычку, ее предваряют косой чертой:

“Издательский дом \”Питер\” ”

Дословные литералы. Эти литералы начинаются с символа @, который отключает обработку управляющих последовательностей и позволяет получать строки в том виде, в котором они записаны:

@ ‖Никто не доволен своей внешностью, но каждый доволен своим умом‖ @‖Издательский дом ―Питер‖ ―

Комментарии. В С# существует 3 вида комментариев – однострочные, многострочные и XML комментарии. Однострочный комментарий начинается с // и заканчивается символом перехода на новую строку. Многострочный комментарий заключается в /* */ и может занимать часть строки, целую строку или несколько строк. Формирование документации в формате XML используют комментарии, начинающиеся с ///. Компилятор извлекает эти комментарии из программы, проверяет на соответствие правилам и записывает в отдельный файл.

Типы данных С#. Переменные, операции, выражения

Тип данных однозначно определяет:

o Внутреннее представление данных – множество их значений o Допустимые действия над данными (операции и функции)

Каждое выражение в программе имеет определенный тип. Память, в которой хранятся данные во время выполнения программы, делятся на две области – стек и динамическая память. Стек используется для хранения величин, память под которые выделяет компилятор. В динамической области памяти (heapкуча) память резервируется и освобождается во время выполнения программы с помощью специальных команд самим программистом.

Классификация типов данных в С# представлена на рисунке 3.1

Рисунок 3.1 – Классификация типов данных в С# по различным признакам

Встроенные типы

Встроенные типы приведены в таблице 3.1. Они однозначно соответствуют стандартным классам библиотеки .NET определенным в пространстве имен System.

Как видно из таблицы, существует несколько вариантов представления целых и вещественных величин.

Внутреннее представление величины целого типа – целое число в двоичном коде. В

знаковых типах старший бит числа интерпретируется как знаковый (0-положительное число, 1- отрицательное). Отрицательные числа чаще всего представляются в дополнительном коде – все разряды числа, кроме знакового разряда, инвертируются, затем к числу прибавляется единица, и знаковому биту присваивается единица. Беззнаковые типы позволяют представлять только положительные числа, поскольку старший разряд рассматривается как часть кода числа.

Вещественные типы хранятся в памяти иначе, чем целочисленные. Внутреннее представление величины вещественного типа состоит из двух частей – мантиссы и порядка,

каждая часть имеет знак. Длина мантиссы определяет точность числа, а длина порядка – его

диапазон. Например, число 0,381*10^4 хранятся цифры мантиссы 381 и порядок 4, для числа 560,3*10^2 – мантисса 5603 и порядок 5.

Тип decimal предназначен для денежных вычислений, в которых критичны ошибки округления. Данные тип не относится к вещественным типам, у них разное внутреннее представление. Величины денежного типа нельзя использовать в одном выражении с вещественными буз явного преобразования типа.

Любой встроенный тип языка С# соответствует стандартному классу библиотеки .NET. Везде, где используется имя встроенного типа его можно заменить именем класса библиотеки System. Это значит, что у встроенных типов есть методы и поля. Например:

double.MaxValue (System.Double.MaxValue) – максимальное значение числа типа double. uint.MinValue (System.UInt32.MinValue) – минимальное значение числа типа uint.

Таблица 3.1 – Встроенные типы языка С#

Название

Ключевое

Тип

Диапазон

Описание

Размер,

слово

.NET

битов

 

 

 

Логический тип

bool

Boolean

true, false

 

 

Целые типы

sbyte

SByte

-128..127

Со знаком

8

 

byte

Byte

0..255

Без знака

8

 

short

Int16

-32768..32767

Со знаком

16

 

ushort

UInt16

0..65535

Без знака

16

 

int

Int32

-2*10^9..2*10^9

Со знаком

32

 

uint

UInt32

0..4*10^9

Без знака

32

 

long

Int64

-9*10^18..9*10^18

Со знаком

64

 

ulong

UInt64

0..18*10^18

Без знака

64

Символьный тип

char

Char

U+0000..U+ffff

Unicode-символ

16

Вещественные типы

float

Single

1.5*10^-45..3.4*10^38

7 цифр

32

 

double

Double

5.0*10^-324..1.7*10^308

15-16 цифр

64

Финансовый тип

decimal

Decimal

1.0*10^-28..7.9*10^28

28-29 цифр

128

Строковый тип

 

 

Длина ограничена

Строка из

 

 

string

String

объемом доступной

Unicode-

 

 

 

 

памяти

символов

 

Тип object

object

Object

Можно хранить все что

Всеобщий

 

 

угодно

порядок

 

 

 

 

 

Типы-значения и ссылочные типы

Типы С# разделяют по способу хранения элементов на типы значения и ссылочные типы. Элементы типов значений представляют собой просто последовательность битов в памяти, необходимый объем которой определяет компилятор. То есть, величины таких типов хранят сови значения непосредственно. Величина ссылочного типа хранит не данные, а ссылку на них (адрес, про которому расположены данные). Сами данные хранятся в динамической памяти.

Однако, все типы являются потомками базового класса Object. На рисунке 3.2 представлена классификация типов данных С# по способу хранения данных.

Рисунок 3.2

Упаковка и распаковка

Для того, чтобы величины ссылочного и значимого типов могли использоваться совместно, необходимо иметь возможность преобразования из одного типа в другой. Преобразование из типазначения в ссылочный тип называется упаковкой, обратное преобразование – распаковкой.

Если величина значимого типа используется в том месте, где требуется ссылочный тип, автоматически выполняется создание промежуточной величины ссылочного типа – создается ссылка, в heap выделяется соответствующий объем памяти и туда копируется значение величины, то есть значение как бы упаковывается в объект. При необходимости обратного преобразования с величины ссылочного типа ―снимается упаковка‖, и в дальнейших действиях участвует только ее значение.

Переменные

Переменная — это именованная область памяти, предназначенная для хранения данных определенного типа. Во время выполнения программы значение переменной можно изменять. Все переменные, используемые в программе, должны быть описаны явным образом. При описании для каждой переменной задаются ее имя и тип.

Пример описания целой переменной с именем а и вещественной переменной х: int a; float x;

Идентификатор (имя переменной) служит для обращения к области памяти, в которой хранится значение переменной. Имя дает программист. Оно должно соответствовать правилам именования идентификаторов С#, отражать смысл хранимой величины и быть легко распознаваемым.

Тип переменной выбирается, исходя из диапазона и требуемой точности представления данных.

При объявлении можно присвоить переменной некоторое начальное значение, то есть

инициализировать ее, например: int a, b = 1;

float x = 0.1, у = 0.lf;

Здесь описаны:

o переменная а типа int, начальное значение которой не присваивается; o переменная b типа int, ее начальное значение равно 1;

o переменные х и у типа float, которым присвоены одинаковые начальные значения 0.1. Разница между ними состоит в том, что для инициализации переменной х сначала формируется константа типа double (это тип, присваиваемый по умолчанию

литералам с дробной частью), а затем она преобразуется к типу float; переменной у значение 0.1 присваивается без промежуточного преобразования.

При инициализации можно использовать не только константу, но и выражение — главное, чтобы на момент описания оно было вычисляемым, например:

int b = 1, а = 100; int x = b * а + 25:

Инициализировать переменную прямо при объявлении не обязательно, но перед тем, как ее использовать в вычислениях, это сделать все равно придется, иначе компилятор сообщит об ошибке.

Так называемая область действия переменной, то есть область программы, где можно использовать переменную, начинается в точке ее описания и длится до конца блока, внутри которого она описана. Блок — это код, заключенный в фигурные скобки. Основное назначение блока — группировка операторов. В С# любая переменная описана внутри какого-либо блока: класса, метода или блока внутри метода.

Имя переменной должно быть уникальным в области ее действия. Область действия распространяется на вложенные в метод блоки, из этого следует, что во вложенном блоке нельзя объявить переменную с таким же именем, что и в охватывающем его, например:

class X

 

 

 

// начало описания класса X

{

 

 

 

 

 

int А;

// поле А класса X

int В;

//

поле В класса X

void Y()

 

// --------------------------------------- метод Y класса X

{

 

 

 

 

 

int С;

 

 

// локальная переменная С, область действия - метод Y

int A;

 

 

// локальная переменная А (НЕ конфликтует с полем А)

{

 

 

 

//

============ вложенный блок 1 ============

int

D;

 

//

локальная переменная D, область действия - этот блок

int

 

А;

//

недопустимо! Ошибка компиляции, конфликт с локальной

//переменной А

 

С =

В;

 

//

присваивание переменной С поля В класса X

С =

this.А;

//

присваивание переменной С поля А класса X

}

 

 

 

// ============ конец блока 1 ===============

{

 

 

 

// ============ вложенный блок 2 ============

int D;

 

// локальная переменная D, область действия - этот блок

}

 

 

 

// ============ конец блока 2 ===============

}

 

 

 

 

//--------------------------------- конец описания метода Y класса X

}

 

 

 

 

// конец описания класса X

В приведенном выше примере описан класс X, содержащий три элемента: поле А, поле В и метод Y. Непосредственно внутри метода Y заданы две локальные переменные — С и А. Внутри метода класса можно описывать переменную с именем, совпадающим с полем класса, потому что существует способ доступа к полю класса с помощью ключевого слова this.

Таким образом, локальная переменная А не «закрывает» поле А класса X, а вот попытка описать во вложенном блоке другую локальную переменную с тем же именем окончится неудачей. Если внутри метода нет локальных переменных, совпадающих с полями класса, к этим полям можно обратиться в методе непосредственно.

Две переменные с именем D не конфликтуют между собой, поскольку блоки, в которых они описаны, не вложены один в другой.

 

Пример описания локальных переменных

using System;

namespace ConsoleApplicationl

{class Classl

{

static void Main()

{

 

int

i = 3;

double

у = 4.12;

 

decimal

d = 600m;

 

string

s = "Вася";

 

Console.Write(

"i = " );

Console.WriteLine( i );

Console.Write(

"y = " );

Console.WriteLine(у );

Console.Write(

"d = " );

Console.WriteLine( d );

Console.Write(

"s = " );

Console.WriteLine( s ); } } }

Переменные создаются при входе в их область действия (блок) и уничтожаются при выходе. Это означает, что после выхода из блока значение переменной не сохраняется. При повторном входе в этот же блок переменная создается заново.

Именованные константы

Можно запретить изменять значение переменной, задав при ее описании ключевое слово const, например:

const int b = 1;

const float x = 0.1, у = 0.1f; // const распространяется на обе переменные

Такие величины называют именованными константами, или просто константами. Они применяются для того, чтобы вместо значений констант можно было использовать в программе их имена. Это делает программу более понятной и облегчает внесение в нее изменений, поскольку изменить значение достаточно только в одном месте программы.

Именованные константы должны обязательно инициализироваться при описании. При инициализации можно использовать не только константу, но и выражение — главное, чтобы оно было вычисляемым на этапе компиляции, например:

const int b = 1, а = 100; const int x = b * а + 25;

Операции и выражения

Выражение — это правило вычисления значения. В выражении участвуют операнды, объединенные знаками операций. Операндами простейшего выражения могут быть константы, переменные и вызовы функций.

Например, а + 2 — это выражение, в котором + является знаком операции, а и 2 — операндами. Пробелы внутри знака операции, состоящей из нескольких символов, не допускаются. По количеству участвующих в одной операции операндов операции делятся на унарные, бинарные и тернарную. Операции С# приведены в таблице 3.1.

Таблица 3.1 - Операции С#

Категория

Знак операции

Название

 

.

Доступ к элементу

 

X()

Вызов метода или делегата

 

X[ ]

Доступ к элементу

 

X++

Постфиксный инкремент

Первичные

new

Выделение памяти

 

X--

Постфиксный декремент

 

typeof

Получение типа

 

checked

Проверяемый код

 

unchecked

Непроверяемый код

 

+

Унарный плюс

 

-

Унарный минус (арифметическое отрицание)

 

!

Логическое отрицание

Унарные

~

Поразрядное отрицание

 

++X

Префиксный инкремент

 

--X

Префиксный декремент

 

(тип)x

Преобразование типа

Мультипликативные

*

Умножение

(типа умножения)

/

Деление

 

%

Остаток отделения

Аддитивные

+

Сложение

(типа сложения)

 

-

Вычитание

 

 

 

Сдвига

 

<<

Сдвиг влево

 

 

 

 

>>

Сдвиг вправо

 

 

 

 

 

 

 

 

 

 

<

Меньше

 

 

 

 

 

>

Больше

 

 

 

Отношения и

 

<=

Меньше или равно

 

 

проверки типа

 

>=

Больше или равно

 

 

 

 

is

Проверка на принадлежность типу

 

 

 

 

as

Приведение типа

 

 

 

Проверка на

 

= =

Равно

 

 

 

равенство

 

!=

Не равно

 

 

 

Поразрядные

 

&

Поразрядное И (конъюнкция)

 

 

 

^

Поразрядное исключающее ИЛИ

 

 

логические

 

 

 

 

|

Поразрядное ИЛИ (дизъюнкция)

 

 

 

 

 

 

Условные логические

 

&&

Логическое И

 

 

 

 

||

Логическое ИЛИ

 

 

 

 

 

 

 

 

Тернарная операция

 

?:

Условная операция

 

 

Продолжение таблицы 3.1

 

 

 

 

 

Категория

 

Знак операции

 

Название

 

 

 

 

=

Присваивание

 

 

 

 

 

*=

Умножение с присваиванием

 

 

 

 

/=

Деление с присваиванием

 

 

 

 

%=

Остаток от деления с присваиванием

 

 

 

+=

Сложение с присваиванием

 

 

Присваивания

 

-=

Вычитание с присваиванием

 

 

 

<<=

Сдвиг влево с присваиванием

 

 

 

 

 

 

 

 

>>=

Сдвиг вправо с присваиванием

 

 

 

 

&=

Поразрядное И с присваиванием

 

 

 

 

^=

Поразрядное

исключающее

ИЛИ

с

 

 

 

присваиванием

 

 

 

 

 

|=

Поразрядное ИЛИ с присваиванием

 

 

Операции в выражении выполняются в определенном порядке в соответствии с приоритетами, как и в математике. В приведенной выше таблице 3.1 операции расположены по убыванию приоритетов.

Результат вычисления выражения характеризуется значением и типом. Например, пусть а и b — переменные целого типа и описаны так:

int а=2, b = 5;

Тогда выражение а + b имеет значение 7 и тип int, а выражение а = b имеет значение, равное помещенному в переменную а (в данному случае — 5), и тип, совпадающий с типом этой переменной.

Если в одном выражении соседствуют несколько операций одинакового приоритета, операции присваивания и условная операция выполняются справа налево, остальные — слева направо. Для изменения порядка выполнения операций используются круглые скобки, уровень их вложенности практически не ограничен.

Например, а + b + с означает (а + b) + с, а = b = с означает а = (b = с). То есть сначала вычисляется выражение b = с, а затем его результат становится правым операндом для операции присваивания переменной а.

Преобразования встроенных арифметических типов-значений

При вычислении выражений может возникнуть необходимость в преобразовании типов.

Если операнды, входящие в выражение, одного типа и операция для этого типа определена, то результат выражения будет иметь тот же тип.