Суббота, 23.11.2024, 09:59
Приветствую Вас Гость | RSS
Меню сайта
Категории раздела
База языка C# [3]
В данном разделе будут статьи по базовым понятиям языка C#
Основы языка С# [22]
Раздел продолжает рассматривать основы языка C#
Задачи [2]
примеры решения задач
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск
Главная » Статьи » C# » Основы языка С#

Выражения и преобразование типов

Выражение – это синтаксическая единица языка, определяющая способ вычисления некоторого значения. Выражения состоят из операндов, операций и скобок. Каждый операнд является в свою очередь выражением или одним из его частных случаев – константой, переменной или функций.
Замечание. Список математических функций, реализованных в С# приведен в приложении 2.
Примеры выражений:
(а + 0.12)/6 х && у || !z (t * Math.Sin(x)-l.05e4)/((2 * k + 2) * (2 * k + 3))
Вычисление значения выражения происходит с учетом приоритета операций (см. Приложение 1), которые в нем участвуют. Если в выражении соседствуют операции одного приоритета, то унарные операции, условная операция и операции присваивания выполняются справа налево, остальные — слева направо. Например,
а = b = с означает a=(b=c),
a+b+c означает (а + b) + с.
Если необходимо изменить порядок выполнения операций, то в выражении необходимо поставить круглые скобки.
Результат вычисления выражения характеризуется значением и типом. Например, если а и b — переменные целого типа и описаны так:

int а = 2, b = 5;

то выражение а + b имеет значение 7 и тип int.
В выражение могут входить операнды различных типов. Если операнды имеют одинаковый тип, то результат операции будет иметь тот же тип. Если операнды разного типа, то перед вычислениями выполняются преобразования более коротких типов в более длинные для сохранения значимости и точности. Иерархия типов данных приведена в следующей схеме:

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

static void Main()

{

    int i = -4;

    byte j = 4;

    int a = (int)j; //1

    byte b = (byte)i; //2

    Console.WriteLine("{0} {1}", a, b);

}

В строке 1 можно обойтись без явного преобразования типа, т.е. можно записать a=j, т.к. тип int в иерархии типов находится выше типа byte и существует путь для неявного преобразования типа byte в тип int. Но пути для неявного преобразования от типа int к типу byte нет, поэтому в строке 2 нельзя записать b=i – компилятор выдаст сообщение об ошибке.
Замечание. Рассмотрим один важный пример. В С++ допустим следующий фрагмент кода:

int x = 10;

int y = (x) ? 1 : 2; // 3

В данном примере в строке 3 происходит неявное преобразование типа переменной х, т.е. типа int, к логическому типу. При этом, если х принимает значение 0 (или null для ссылочных типов), то ему ставится в соответствие логическая величина false, всем другим значениям в соответствие ставится логическое значение true. В нашем случае переменная х принимает ненулевое значение, поэтому оно будет преобразовано к значению true, и в переменную y запишется значение 1.
В языке С# подобное неявное преобразование невозможно. Необходимо обязательно выполнять операцию сравнения значения х с 0. Например, следующим образом:

int x = 10;

int y = (x != 0) ? 1 : 2; // 3

 

ПРИЛОЖЕНИЕ 2. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ ЯЗЫКА С#
С# содержит большое количество встроенных математических функций, которые реализованы в классе Math пространства имен System.
Рассмотрим краткое описание некоторых математических функций, подробнее с ними можно познакомиться в справочной систем VS или технической документации. Особое внимание следует обратить на типы операндов и результатов, т.к. каждая функция может иметь несколько перегруженных версий.
Замечание. Использование нескольких функций с одним и тем же именем, но с различными типами параметров, называется перегрузкой функции. Например, функция Math.Abs(), вычисляющая модуль числа, имеет 7 перегруженных версий: double Math.Abs (double x), float Math.Abs (float x), int Math.Abs(int x), и т.д.

Название Описание
1. Math.Abs(<выражение>) Модуль
2. Math.Ceiling(<выражение>) Округление для большего целого
3. Math.Cos(<выражение>) Косинус
4. Math.Е Число е
5. Math.Exp(<выражение>) Экспонента
6. Math.Floor(<выражение>) Округление до меньшего целого
7. Math.Log(<выражение>) Натуральный логарифм
8. Math.Log10(<выражение>) Десятичный логарифм
9. Math.Max(<выражение1>, <выражение2>) Максимум из двух значений
10. Math.Min(<выражение1>, <выражение2>) Минимум из двух значений
11. Math.PI Число p
12. Math.Pow(<выражение1>, <выражение2>) Возведение в степень
13. Math.Round(<выражение>) Простое округление
14. Math.Sign(<выражение>) Знак числа
15. Math.Sin(<выражение>) Синус
16. Math.Sqrt(<выражение>) Квадратный корень
17. Math.Тan(<выражение>) Тангенс

 

Категория: Основы языка С# | Добавил: solowey (16.01.2016)
Просмотров: 212 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт