40966

Выражения. Значения выражений.

Лекция

Информатика, кибернетика и программирование

Первичное выражение создания не массива: литерал простое имя выражение в скобках доступ к члену выражение вызова метод доступа к элементу доступ через this доступ к базовому объекту выражение после инкремента выражение после декремента выражение создания объекта выражение создания делегата выражение typeof выражение checked выражение unchecked выражение значения по умолчанию Простые имена Просто имя состоит из идентификатора за которым может следовать список аргументов типа: простое имя: индетификатор список аргументов типанеобязательно...

Русский

2013-10-22

174 KB

0 чел.

Выражения.

Значения выражений.

Значение переменной — это значение, которое хранится в данный момент в расположении, указанном переменной.

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

Операторы

Выражения состоят из операндов и операторов. Операторы в выражении указывают, какие операции производятся с операндами. К операторам относятся, например, +, -, *, / и new. К операндам относятся, например, литералы, поля, локальные переменные и выражения.

Существует три типа операторов.

  •  Унарные операторы. У унарного оператора есть только один операнд и оператор может записываться в префиксной форме (например, –x) или постфиксной форме (например, x++).
  •  двоичные операторы; У бинарных операторов два операнда и они записываются в виде инфикса (например, x + y).
  •  Тернарный оператор. Существует только один тернарный оператор, ?:. В нем три операнда и используется инфиксная запись (c? x: y).

Порядок вычисления операторов в выражении определяется приоритетом и ассоциативностью операторов.

Ассоциативностью операторов называют последовательность их выполнения. Операнды в выражении вычисляются слева направо.

Приоритет оператора задается в определении связанной с ним грамматической структуры. Например, аддитивное_выражение состоит из последовательности мультипликативных_выражений, разделенных операторами + или –, таким образом, операторы + или – имеют более низкий приоритет, чем операторы *, / и %.

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

Категория

Операторы

Основной

x.y  f(x)  a[x]  x++  x--  new

typeof  default  checked  unchecked  delegate

Унарный

+  -  !  ~  ++x  --x  (T)x

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

*  /  %

Аддитивный

+  -

Сдвиг

<<  >>

Отношение и проверка типа

<  >  <=  >=  is  as

Равенство

==  !=

Логическое И

&

Исключающее ИЛИ

^

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

|

Условное И

&&

Условное ИЛИ

||

Объединение с нулем

??

Условный

?:

Присваивание и лямбда-выражение

=  *=  /=  %=  +=  -=  <<=  >>=  &=  ^=  |=

=>

  •  За исключением операторов присваивания все бинарные операторы обладают левой ассоциативностью. Это означает, что все операции выполняются слева направо. Например, выражение x + y + z вычисляется как (x + y) + z.
  •  Операторы присваивания и условный оператор (?:) обладают правой ассоциативностью. Это означает, что все операции выполняются справа налево. Например, выражение x = y = z вычисляется как x = (y = z).

Приоритетом и ассоциативностью можно управлять с помощью скобок.

Некоторые операторы допускают перегрузку.

Первичные выражения.

Первичные выражения включают самые простые формы выражений.

Первичное выражение создания не массива:

литерал

простое имя

выражение в скобках

доступ к члену

выражение вызова

метод доступа к элементу

доступ через this

доступ к базовому объекту

выражение после инкремента

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

выражение создания объекта

выражение создания делегата

выражение typeof

выражение checked

выражение unchecked

выражение значения по умолчанию

Простые имена

Просто имя состоит из идентификатора, за которым может следовать список аргументов типа:

простое_имя:
индетификатор   список_аргументов_типа
необязательно

Для каждого вхождения данного идентификатора в качестве простого_имени в выражении или деклараторе внутри области объявления локальных переменных, непосредственно включающей это вхождение, каждое вхождение того же самого идентификатора в качестве простого_имени в выражении или декларатора должно ссылаться на одну и ту же сущность. Это правило позволяет гарантировать, что внутри определенного блока, блока switch, а также операторов for, foreach и using имя всегда имеет одинаковое значение.

Правило инвариантности значения применяется только к простым именам. Один идентификатор вполне может иметь одно значение в виде простого имени и другое значение в виде правого операнда в методе доступа к члену. Например:

using System;

namespace ConsoleApplication7

{

   struct Point

   {

       int x, y;

       public Point(int x, int y)

       {

           this.x = x;

           this.y = y;

       }

       public override string ToString()

       {

           return String.Format("{0}  {1}", x, y);

       }

   }

   class Program

   {

       static void Main(string[] args)

       {

           Point p = new Point(3, 5);

           Console.WriteLine(p);

       }

   }

}

В примере простые имена x и y относятся к параметрам, но это не мешает выражениям доступа к членам this.x и this.y иметь доступ к полям.

Выражения со скобками

Выражение_со_скобками состоит из выражения, заключенного в скобки.

выражение_в_скобках:
(   выражение   )

Выражение_со_скобками вычисляется путем вычисления выражения внутри скобок.

Доступ к члену

Оператор "точка"  используется для доступа к членам.

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

Выражение_вызова используется для вызова метода.

выражение_вызова:
первичное_выражение   
(   список_аргументовнеобязательно   )

Например

TestMethod();

Доступ this

Доступ_this представляет собой зарезервированное слово this.

доступ_через_this:
this

Доступ_this допустим только в блоке конструктора экземпляра, метода экземпляра или метода доступа к экземпляру. Примеры.

this используется в основном_выражении внутри конструктора экземпляра структуры.  Он классифицируется как значение. Типом значения является тип экземпляра структуры, внутри которой происходит это использование, а значением является создаваемая структура. Переменная this конструктора экземпляра структуры действует точно так же, как параметр out типа структуры, в частности, это означает, что переменная должна явно назначаться в каждом пути выполнения конструктора экземпляра.

struct Point

   {

       int x, y;

       public Point(int x, int y)

       {

           this.x = x;

           this.y = y;

       }

       

   }

Доступ this используется в основном_выражении внутри конструктора экземпляра класса. Он классифицируется как значение. Типом значения является тип экземпляра класса, внутри которого происходит это использование, а значением является ссылка на создаваемый объект.

class Point

   {

       int x, y;

       public Point(int x, int y)

       {

           this.x = x;

           this.y = y;

       }

       

       public override string ToString()

       {

           return String.Format("{0}  {1}", x, y);

       }

   }

Доступ this используется в основном_выражении внутри метода экземпляра

using System;

namespace ConsoleApplication7

{

   class Employee

   {

       private string name;

       private string alias;

       private decimal salary = 3000.00m;

       // Constructor:

       public Employee(string name, string alias)

       {

           // Use this to qualify the fields, name and alias:

           this.name = name;

           this.alias = alias;

       }

       // Printing method:

       public void printEmployee()

       {

           Console.WriteLine("Name: {0}\nAlias: {1}", name, alias);

           // Passing the object to the CalcTax method by using this:

           Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));

       }

       public decimal Salary

       {

           get { return salary; }

       }

   }

   class Tax

   {

       public static decimal CalcTax(Employee E)

       {

           return 0.08m * E.Salary;

       }

   }

   class Program

   {

       static void Main(string[] args)

       {

           Employee E1 = new Employee("Mingda Pan", "mpan");

           // Display results:

           E1.printEmployee();

       }

   }

}

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

Также this используется для объявления индексаторов.

Оператор new.

Оператор new используется для создания новых экземпляров типов.

Существует три формы выражений new:

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

Пример

struct SampleStruct

{

  public int x;

  public int y;

  public SampleStruct(int x, int y)

  {

     this.x = x;

     this.y = y;

  }

}

class SampleClass

{

  public string name;

  public int id;

  public SampleClass() {}

  public SampleClass(int id, string name)

  {

     this.id = id;

     this.name = name;

  }

}

class ProgramClass

{

  static void Main()

  {

     // Create objects using default constructors:

     SampleStruct Location1 = new SampleStruct();

     SampleClass Employee1 = new SampleClass();

     // Display values:

     Console.WriteLine("Default values:");

     Console.WriteLine("   Struct members: {0}, {1}",

            Location1.x, Location1.y);

     Console.WriteLine("   Class members: {0}, {1}",

            Employee1.name, Employee1.id);

     // Create objects using parameterized constructors:

     SampleStruct Location2 = new SampleStruct(10, 20);

     SampleClass Employee2 = new SampleClass(1234, "Luciana Ramos");

     // Display values:

     Console.WriteLine("Assigned values:");

     Console.WriteLine("   Struct members: {0}, {1}",

            Location2.x, Location2.y);

     Console.WriteLine("   Class members: {0}, {1}",

            Employee2.name, Employee2.id);

  }

}

Если в определение структуры SampleStruct добавить конструктор экземпляра по умолчанию

public SampleStruct() { }

Это приведет к ошибке: Структуры не могут содержать явных конструкторов без параметров

Выражения создания объектов

Выражение_создания_объекта используется для создания нового экземпляра типа_класса или типа_значения.

выражение_создания_объекта:
new   тип   (   список_аргументовнеобязательно   )   инициализатор_объекта_или_коллекциинеобязательно
new   тип   инициализатор_объекта_или_коллекции

инициализатор_объекта_или_коллекции:
инициализатор_объекта
инициализатор_коллекции

Тип выражения_создания_объекта должен быть равен типу_класса, типу_значения или параметру_типа. Тип не может быть типом_класса abstract.

Во время выполнения обработка выражения_создания_объекта в виде new T(A), где T является типом_класса или типом_структуры, а A является необязательным списком_аргументов, включает следующие этапы.

  •  Если T является типом_класса:
  •  Создается новый экземпляр класса T.
  •  Все поля нового экземпляра инициализируются с помощью значений по умолчанию.
  •  В соответствии с правилами вызова функции-члена вызывается конструктор экземпляра. Ссылка на созданный экземпляр автоматически передается конструктору экземпляра, и к этому экземпляру можно обращаться из этого конструктора с помощью this.
  •  Если T является типом_структуры:
  •  С помощью выделения временной локальной переменной создается экземпляр типа T. Поскольку для явного присвоения значений каждому полю создаваемого экземпляра требуется конструктор экземпляра типа_структуры, инициализация временной переменной не требуется.
  •  В соответствии с правилами вызова функции-члена вызывается конструктор экземпляра. Ссылка на созданный экземпляр автоматически передается конструктору экземпляра, и к этому экземпляру можно обращаться из этого конструктора с помощью this.

Оператор typeof

Оператор typeof используется для получения объекта System.Type для типа.

Пример

System.Type type = typeof(int);

Пример

using System;

namespace ConsoleApplication7

{

   class Employee

   {

       private string name;

       private string alias;

       private decimal salary = 3000.00m;

       // Constructor:

       public Employee(string name, string alias)

       {

           // Use this to qualify the fields, name and alias:

           this.name = name;

           this.alias = alias;

       }

       // Printing method:

       public void printEmployee()

       {

           Console.WriteLine("Name: {0}\nAlias: {1}", name, alias);

           // Passing the object to the CalcTax method by using this:

           Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));

       }

       public decimal Salary

       {

           get { return salary; }

       }

   }

   class Tax

   {

       public static decimal CalcTax(Employee E)

       {

           return 0.08m * E.Salary;

       }

   }

   class Program

   {

       static void Main(string[] args)

       {

           Employee E1 = new Employee("Mingda Pan", "mpan");

           // Display results:

           E1.printEmployee();

           Type t = typeof(Employee);

           // Alternatively, you could use

           // SampleClass obj = new SampleClass();

           // Type t = obj.GetType();

           Console.WriteLine("Methods:");

           System.Reflection.MethodInfo[] methodInfo = t.GetMethods();

           foreach (System.Reflection.MethodInfo mInfo in methodInfo)

               Console.WriteLine(mInfo.ToString());

           Console.WriteLine("Members:");

           System.Reflection.MemberInfo[] memberInfo = t.GetMembers();

           foreach (System.Reflection.MemberInfo mInfo in memberInfo)

               Console.WriteLine(mInfo.ToString());

           

       }

   }

}

PAGE   \* MERGEFORMAT 1


 

А также другие работы, которые могут Вас заинтересовать

36498. Рівняння Ван-дер-Ваальса 238.96 KB
  Дія відштовхування зводиться до того що молекула не допускає проникнення у свій обєм інших молекул. Отже сили відштовхування враховуються через деякий ефективний обєм молекул. Якщо газ у нас не дуже стиснутий то взаємодії між молекулами будуть лише парні участь третьої четвертої та інших молекул малоймовірна. Припустимо що у посудині із обємом знаходяться лише дві однакові молекули.
36499. Розподіл газових молекул за проекціями (напрямками) швидкостей 3.96 MB
  Переписавши ось у такому вигляді отримане рівняння визначимо фізичний зміст цієї функції. У вибраній нами системі координат у просторі швидкостей відстань до початку координат і є модуль швидкості отже Тепер ми можемо записати таке рівняння . Такого роду рівняння мають назву функціональних. Для їх визначення ми повинні знайти два незалежних рівняння.
36500. Розподіл молекул у полі сил. Формула Больцмана. Барометрична формула. Дослід Перрена по визначенню числа Авогадро 258.99 KB
  Наявність зовнішньої сили призведе до того що молекули у просторі будуть розміщені неоднорідно отже створюватимуть у різних точках простору різний тиск. Для осі ця різниця тисків на грані паралелепіпеда перпендикулярні осі де зміна тиску на одиницю довжини; зміна тиску на бічних гранях; площа граней. Згадаємо що ; відповідно повні диференціали зміни тиску та потенціальної енергії. Повний диференціал зміни тиску газу дорівнює добутку концентрації молекул на повний диференціал зміни потенціальної енергії молекули взятому з...
36501. Біноміальний розподіл 536.29 KB
  Кількість частинок у ньому . Кількість комірок у обємі причому завжди виконується умова тобто частинка завжди знайде собі місце. Виділимо у обємі менший фіксований обєм і будемо шукати імовірність того що кількість частинок потрапить у цей обєм. Кількість комірок у обємі повинно бути принаймні не меншою за щоб усі частинки могли розміститись.
36502. Тиск газу з точки зору молекулярно-кінетичної теорії. Основне рівняння кінетичної теорії ідеального газу. Зв’язок між тиском газу та середньою кінетичною енергією газових молекул 205.51 KB
  Основне рівняння кінетичної теорії ідеального газу. Звязок між тиском газу та середньою кінетичною енергією газових молекул. Розрахуємо тиск газу на стінку посудини.
36503. Рівність середньокінетичних енергій молекул газу при взаємодії двох газів із непроникливою стінкою 464.46 KB
  І тепер перейдемо до вивчення елементів симетрії кристалу. Елементи симетрії кристалів. Симетрія це властивість тіла суміщатися із самим собою під час деяких операцій або перетворень симетрії. З однією операцією симетрії ми вже зустрічались на початку лекції це трансляційна симетрія.
36504. Обертальний броунівський рух 244.07 KB
  Такі обертові рухи можна зіставити з коливаннями маленького дзеркальця підвішеного на тонкій пружній дротинці в газі. Величина оскільки дзеркальце рівну кількість разів повертається за годинниковою стрілкою і проти неї тому цим доданком можна знехтувати. Дзеркальце у газі можна розглядати як величезну броунівську частинку так само як і поршень коли ми розглядали газокінетичний зміст температури. Отже за значеннями макроскопічних параметрів якими є температура модуль кручення дротинки та середнє значення квадрату кутового відхилення...
36505. Розподіл молекул за абсолютними значеннями швидкості. Функція розподілу Максвелла 256.56 KB
  Тепер вже швидкість беремо за абсолютним значенням отже вона буде додатньою. Отже на графіку наведені залежності для кількох температур. Отже сформульований постулат стверджує що процес Клаузіуса неможливий. Отже узагальнений постулат ТомсонаПланка “Неможливо створити періодично діючу машину єдиним результатом дії якої було б виконання роботи лише за рахунок охолодження нагрівачаâ€.
36506. Якісне пояснення температурної залежності теплоємності газів на підставі квантових уявлень 630.47 KB
  Звідки може брати енергію осцилятор Він її отримує при зіткненнях. Але прийняти будьяку енергію осцилятор не може. Він приймає енергію тільки кратну і переходить на один із наступних енергетичних рівнів на рисунку. Наша молекула зможе прийняти необхідну енергію лише від молекули із заштрихованої області.