Си шарп порядок операций

Инструкции (Руководство по программированию на C#)

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

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

 static void Main() < // Declaration statement. int counter; // Assignment statement. counter = 1; // Error! This is an expression, not an expression statement. // counter + 1; // Declaration statements with initializers are functionally // equivalent to declaration statement followed by assignment statement: int[] radii = < 15, 32, 108, 74, 9 >; // Declare and initialize an array. const double pi = 3.14159; // Declare and initialize constant. // foreach statement block that contains multiple statements. foreach (int radius in radii) < // Declaration statement with initializer. double circumference = pi * (2 * radius); // Expression statement (method invocation). A single-line // statement can span multiple text lines because line breaks // are treated as white space, which is ignored by the compiler. System.Console.WriteLine("Radius of circle #is . Circumference = ", counter, radius, circumference); // Expression statement (postfix increment). counter++; > // End of foreach statement block > // End of Main method body. > // End of SimpleStatements class. /* Output: Radius of circle #1 = 15. Circumference = 94.25 Radius of circle #2 = 32. Circumference = 201.06 Radius of circle #3 = 108. Circumference = 678.58 Radius of circle #4 = 74. Circumference = 464.96 Radius of circle #5 = 9. Circumference = 56.55 */ 

Типы инструкций

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

  • if
  • switch
  • do
  • for
  • foreach
  • while
  • break
  • continue
  • goto
  • return
  • yield
  • throw
  • try-catch
  • try-finally
  • try-catch-finally
Читайте также:  Python import list type

Инструкции объявления

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

// Variable declaration statements. double area; double radius = 2; // Constant declaration statement. const double pi = 3.14159; 

Инструкции выражений

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

// Expression statement (assignment). area = 3.14 * (radius * radius); // Error. Not statement because no assignment: //circ * 2; // Expression statement (method invocation). System.Console.WriteLine(); // Expression statement (new object creation). System.Collections.Generic.List strings = new System.Collections.Generic.List(); 

Пустая инструкция

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

void ProcessMessages() < while (ProcessMessage()) ; // Statement needed here. >void F() < //. if (done) goto exit; //. exit: ; // Statement needed here. >

Внедренные инструкции

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

// Recommended style. Embedded statement in block. foreach (string s in System.IO.Directory.GetDirectories( System.Environment.CurrentDirectory)) < System.Console.WriteLine(s); >// Not recommended. foreach (string s in System.IO.Directory.GetDirectories( System.Environment.CurrentDirectory)) System.Console.WriteLine(s); 

Внедренная инструкция, не заключенная в скобки <>, не может быть инструкцией объявления или инструкцией с меткой. Это показано в следующем примере:

if(pointB == true) //Error CS1023: int radius = 5; 

Чтобы устранить ошибку, поместите внедренную инструкцию в блок:

Вложенные блоки инструкций

Блоки инструкций могут быть вложенными, как показано в следующем коде:

foreach (string s in System.IO.Directory.GetDirectories( System.Environment.CurrentDirectory)) < if (s.StartsWith("CSharp")) < if (s.EndsWith("TempFolder")) < return s; >> > return "Not found."; 

Недостижимые инструкции

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

// An over-simplified example of unreachable code. const int val = 5; if (val < 4) < System.Console.WriteLine("I'll never write anything."); //CS0162 >

Спецификация языка C#

Дополнительные сведения см. в разделе Операторы в спецификации языка C#.

См. также

Источник

Операторы и выражения C# (справочник по C#)

C# предоставляет ряд операторов. Многие из них поддерживаются встроенными типами и позволяют выполнять базовые операции со значениями этих типов. В число этих операторов входят следующие группы:

  • Арифметические операторы, выполняющие арифметические операции с числовыми операндами.
  • Операторы сравнения, сравнивающие числовые операнды.
  • Логические операторы, выполняющие логические операции с операндами bool .
  • Битовые операторы и операторы сдвига выполняют битовые операции или операции сдвига с операндами целочисленных типов.
  • Операторы равенства проверяют равенство или неравенство своих операндов.

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

Простейшими выражениями C# являются литералы (например, целые и реальные числа) и имена переменных. Их можно объединить в сложные выражения с помощью операторов. Приоритет и ассоциативность операторов определяют порядок выполнения операций в выражении. Порядок вычисления, определяемый приоритетом и ассоциативностью операторов, можно изменить с помощью скобок.

В следующем коде примеры выражений находятся в правой части назначений:

int a, b, c; a = 7; b = a; c = b++; b = a + b * c; c = a >= 100 ? b : c / 10; a = (int)Math.Sqrt(b * b + c * c); string s = "String literal"; char l = s[s.Length - 1]; var numbers = new List(new[] < 1, 2, 3 >); b = numbers.FindLast(n => n > 1); 

Как правило, выражение выдает результат и может быть заключено в другое выражение. Вызов метода void является примером выражения, которое дает результат. Его можно использовать только в качестве оператора, как показано в следующем примере:

Console.WriteLine("Hello, world!"); 

Ниже приведены некоторые другие виды выражений, доступные в C#:

    Выражения интерполированных строк, которые предоставляют удобный синтаксис для создания форматированных строк:

var r = 2.3; var message = $"The area of a circle with radius is ."; Console.WriteLine(message); // Output: // The area of a circle with radius 2.3 is 16.619. 
int[] numbers = < 2, 3, 4, 5 >; var maximumSquare = numbers.Max(x => x * x); Console.WriteLine(maximumSquare); // Output: // 25 
var scores = new[] < 90, 97, 78, 68, 85 >; IEnumerable highScoresQuery = from score in scores where score > 80 orderby score descending select score; Console.WriteLine(string.Join(" ", highScoresQuery)); // Output: // 97 90 85 

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

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

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

var a = 2 + 2 * 2; Console.WriteLine(a); // output: 6 

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

var a = (2 + 2) * 2; Console.WriteLine(a); // output: 8 

В следующей таблице перечислены операторы C# в порядке убывания приоритета. Операторы в каждой строке имеют одинаковый приоритет.

Операторы Категория или имя
x.y, f(x), a[i], x?.y , x?[y] x++, x—, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x-y> Основной
+x, -x, !x, ~x, ++x, —x, ^x, ^x, (T)x, await, &x, *x, true и false Унарный
x..y Диапазон
switch, with Выражения switch и with
x * y, x / y, x % y Мультипликативный
x + y, x – y Аддитивный
x > y Сдвиг
x < y, x y, x >= y, is, as Тестирование типов и относительный
x == y, x != y Равенство
x & y Логическое И или побитовое логическое И
x ^ y Логическое исключающее ИЛИ или побитовое логическое исключающее ИЛИ
x | y Логическое ИЛИ или побитовое логическое ИЛИ
x && y Условное И
x || Y Условное ИЛИ
X?? да Оператор объединения с NULL
C? t : f Условный оператор
x = y, x += y, x -= y, x *= y, x /= y, x %= y, x = y, x &|= y, x ^= y, x >= y, x ?? = y, => Назначение и объявление лямбда-выражений

Ассоциативность операторов

Если операторы имеют одинаковый приоритет, порядок их выполнения определяется ассоциативностью операторов:

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

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

int a = 13 / 5 / 2; int b = 13 / (5 / 2); Console.WriteLine($"a = , b = "); // output: a = 1, b = 6 

Вычисление операнда

Не связанные с приоритетом и ассоциативностью операторов операнды в выражении вычисляются слева направо. В следующих примерах иллюстрируется порядок вычисления операторов и операндов:

Выражение Порядок вычислений
a + b a, b, +
a + b * c a, b, c, *, +
a / b + c * d a, b, /, c, d, *, +
a / (b + c) * d a, b, c, +, /, d, *

Как правило, оцениваются все операнды операторов. Однако некоторые операторы оценивают операнды условно. То есть значение крайнего левого операнда такого оператора определяет, следует ли оценивать другие операнды. Эти операторы являются условными логическими операторами И ( && ) и ИЛИ ( || ) , операторами объединения со значением NULL ?? и ??= , условными операторами со значением NULL ?. и ?[] и условным оператором ?: . Дополнительные сведения см. в описании каждого оператора.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

См. также

Источник

Оцените статью