C# Операторы

Оператор — это символ, который указывает компилятору выполнять определенные математические или логические операции. C# имеет богатый набор встроенных операторов, которые классифицируются следующим образом:

  • Арифметические операторы
  • Операторы отношения
  • Логические операторы
  • Побитовые операторы
  • Операторы присваивания
  • Другие операторы

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

Арифметические операторы

В следующей таблице показаны все арифметические операторы, поддерживаемые C#. Предположим, переменнаяAимеет значение 10, переменнаяBимеет значение 20, тогда:

ОператорыОписаниеПример
+Складывает два операнда.A + B даст в результате 30
-Вычитает второй операнд из первого операнда.A - B даст в результате -10
*Умножает два операнда.A * B даст в результате 200
/Числитель, делённый на знаменательB / A даст в результате 2
%Оператор остатка, остаток после целочисленного деления.B % A даст в результате 0
++Оператор инкремента, увеличивает целочисленное значение на 1.A++ даст в результате 11
--Оператор декремента, уменьшает целочисленное значение на 1.A-- даст в результате 9

Пример

См. пример ниже, чтобы понять все арифметические операторы, доступные в C#:

Пример

using System;

namespace OperatorsAppl
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 21;
            int b = 10;
            int c;

            c = a + b;
            Console.WriteLine("Строка 1 - значение c равно {0}", c);
            c = a - b;
            Console.WriteLine("Строка 2 - значение c равно {0}", c);
            c = a * b;
            Console.WriteLine("Строка 3 - значение c равно {0}", c);
            c = a / b;
            Console.WriteLine("Строка 4 - значение c равно {0}", c);
            c = a % b;
            Console.WriteLine("Строка 5 - значение c равно {0}", c);

            // ++a выполняет инкремент перед присваиванием
            c = ++a;
            Console.WriteLine("Строка 6 - значение c равно {0}", c);

            // На этом этапе значение a равно 22
            // --a выполняет декремент перед присваиванием
            c = --a;
            Console.WriteLine(Строка 7 - значение c равно {0}, c);
            Console.ReadLine();
        }
    }
}

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

Line 1 - c 的值是 31
Line 2 - c 的值是 11
Line 3 - c 的值是 210
Line 4 - c 的值是 2
Line 5 - c 的值是 1
Line 6 - c 的值是 22
Line 7 - c 的值是 21
  • c = a++: Сначала присвойте a переменной c, затем инкрементируйте a.
  • c = ++a: Сначала инкрементируйте a, затем присвойте a переменной c.
  • c = a--: Сначала присвойте a переменной c, затем декрементируйте a.
  • c = --a: Сначала декрементируйте a, затем присвойте a переменной c.

Пример

using System;

namespace OperatorsAppl
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b;

            // a++ присваивает перед инкрементом
            b = a++;
            Console.WriteLine("a = {0}", a);
            Console.WriteLine("b = {0}", b);
            Console.ReadLine();

            // ++a выполняет инкремент перед присваиванием
            a = 1; // Повторно инициализировать a
            b = ++a;
            Console.WriteLine("a = {0}", a);
            Console.WriteLine("b = {0}", b);
            Console.ReadLine();

            // a-- присваивает перед декрементом
            a = 1;  // Повторно инициализировать a
            b= a--;
            Console.WriteLine("a = {0}", a);
            Console.WriteLine("b = {0}", b);
            Console.ReadLine();

            // --a выполняет декремент перед присваиванием
            a = 1;  // Повторно инициализировать a
            b= --a;
            Console.WriteLine("a = {0}", a);
            Console.WriteLine("b = {0}", b);
            Console.ReadLine();
        }
    }
}

При выполнении вышеуказанной программы выводится следующий результат:

a = 2
b = 1
a = 2
b = 2
a = 0
b = 1
a = 0
b = 0

Операторы отношения

В следующей таблице показаны все операторы отношения, поддерживаемые C#. Предположим, переменнаяAимеет значение 10, переменнаяBимеет значение 20, тогда:

ОператорыОписаниеПример
==Проверяет, равны ли значения двух операндов; если они равны, условие истинно.(A == B) не истинно.
!=Проверяет, равны ли значения двух операндов; если они не равны, условие истинно.(A != B) истинно.
>Проверяет, больше ли значение левого операнда, чем значение правого операнда; если да, условие истинно.(A > B) не истинно.
<Проверяет, меньше ли значение левого операнда, чем значение правого операнда; если да, условие истинно.(A < B) истинно.
>=Проверяет, является ли значение левого операнда большим или равным значению правого операнда; если да, условие истинно.(A >= B) не истинно.
<=Проверяет, является ли значение левого операнда меньшим или равным значению правого операнда; если да, условие истинно.(A <= B) истинно.

Пример

См. пример ниже, чтобы понять все операторы отношения, доступные в C#:

Пример

using System;

class Program
{
  static void Main(string[] args)
  {
      int a = 21;
      int b = 10;
     
      if (a == b)
      {
          Console.WriteLine("Строка 1 - a равно b");
      }
      else
      {
          Console.WriteLine("Строка 1 - a не равно b");
      }
      if (a < b)
      {
          Console.WriteLine("Строка 2 - a меньше b");
      }
      else
      {
          Console.WriteLine("Строка 2 - a не меньше b");
      }
      if (a > b)
      {
          Console.WriteLine("Строка 3 - a больше b");
      }
      else
      {
          Console.WriteLine("Строка 3 - a не больше b");
      }
      /* Измените значения a и b */
      a = 5;
      b = 20;
      if (a <= b)
      {
         Console.WriteLine(Строка 4 - a меньше или равно b);
      }
      if (b >= a)
      {
         Console.WriteLine(Строка 5 - b больше или равно a);
      }
  }
}

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

Line 1 - a 不等于 b
Line 2 - a 不小于 b
Line 3 - a 大于 b
Line 4 - a 小于或等于 b
Line 5 - b 大于或等于 a

Логические операторы

В следующей таблице показаны все логические операторы, поддерживаемые C#. Предположим, переменнаяAимеет логическое значение true, переменнаяBимеет логическое значение false, тогда:

ОператорыОписаниеПример
&&Называется логическим оператором AND. Если оба операнда не равны нулю, условие истинно.(A && B) ложно.
||Называется логическим оператором OR. Если хотя бы один операнд не равен нулю, условие истинно.(A || B) истинно.
!Называется оператором логического НЕ. Он используется для инвертирования логического состояния операнда. Если условие истинно, оператор логического НЕ сделает его ложным.!(A && B) истинно.

Пример

См. пример ниже, чтобы понять все логические операторы, доступные в C#:

Пример

using System;

namespace OperatorsAppl
{
    class Program
    {
        static void Main(string[] args)
        {
            bool a = true;
            bool b = true;
           
            if (a && b)
            {
               Console.WriteLine(Строка 1 - условие истинно);
            }
            if (a || b)
            {
                Console.WriteLine(Строка 2 - условие истинно);
            }
            /* Измените значения a и b */
            a = false;
            b = истина;
            if (a && b)
            {
                Console.WriteLine(Строка 3 - условие истинно);
            }
            else
            {
                Console.WriteLine("Строка 3 - условие не истинно");
            }
            if (!(a && b))
            {
                Console.WriteLine(Строка 4 - условие истинно);
            }
            Console.ReadLine();
        }
    }
}

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

Line 1 - 条件为真
Line 2 - 条件为真
Line 3 - 条件不为真
Line 4 - 条件为真

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

Побитовые операторы воздействуют на биты и выполняют операции побитово. Таблицы истинности для &, | и ^ приведены ниже:

pqp & qp | qp ^ q
00000
01011
11110
10011

Предположим, A = 60 и B = 13. В двоичном формате они выглядят следующим образом:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

В следующей таблице перечислены побитовые операторы, поддерживаемые C#. Предположим, переменнаяAимеет значение 60, переменнаяBимеет значение 13, тогда:

ОператорыОписаниеПример
&Если бит присутствует в обоих операндах, бинарный оператор AND копирует бит в результат.(A & B) даёт 12, что равно 0000 1100.
|Если бит присутствует хотя бы в одном из операндов, бинарный оператор OR копирует бит в результат.(A | B) даёт 61, что равно 0011 1101.
^Если бит присутствует в одном операнде, но не в обоих, бинарный оператор XOR копирует бит в результат.(A ^ B) даёт 49, что равно 0011 0001.
~Оператор побитового дополнения — это унарный оператор, который выполняет "переворачивание" битов, то есть 0 становится 1, а 1 становится 0, включая знаковый бит.(~A ) приведёт к -61, что представляет собой 1100 0011, представление в дополнительном коде знакового двоичного числа.
<<Оператор сдвига влево. Значение левого операнда сдвигается влево на число битов, заданное правым операндом.A << 2 даёт 240, что равно 1111 0000.
>>Оператор двоичного сдвига вправо. Значение левого операнда сдвигается вправо на число битов, указанное правым операндом.A >> 2 даёт 15, что равно 0000 1111.

Пример

См. пример ниже, чтобы понять все побитовые операторы, доступные в C#:

Пример

using System;
namespace OperatorsAppl
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 60;            /* 60 = 0011 1100 */  
            int b = 13;            /* 13 = 0000 1101 */
            int c = 0;          

             c = a & b;           /* 12 = 0000 1100 */
             Console.WriteLine("Строка 1 - значение c равно {0}", c );

             c = a | b;           /* 61 = 0011 1101 */
             Console.WriteLine("Строка 2 - значение c равно {0}", c);

             c = a ^ b;           /* 49 = 0011 0001 */
             Console.WriteLine("Строка 3 - значение c равно {0}", c);

             c = ~a;               /*-61 = 1100 0011 */
             Console.WriteLine("Строка 4 - значение c равно {0}", c);

             c = a << 2;     /* 240 = 1111 0000 */
             Console.WriteLine("Строка 5 - значение c равно {0}", c);

             c = a >> 2;     /* 15 = 0000 1111 */
             Console.WriteLine("Строка 6 - значение c равно {0}", c);
            Console.ReadLine();
        }
    }
}

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

Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15

Операторы присваивания

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

ОператорыОписаниеПример
=Оператор простого присваивания, присваивает значение правого операнда левому операнду.C = A + B присвоит значение A + B переменной C
+=Оператор сложения с присваиванием присваивает левому операнду результат прибавления правого операнда к левому операнду.C += A эквивалентно C = C + A.
-=Оператор вычитания с присваиванием присваивает левому операнду результат вычитания правого операнда из левого операнда.C -= A эквивалентно C = C - A.
*=Оператор умножения с присваиванием присваивает левому операнду результат умножения правого операнда на левый операнд.C *= A эквивалентно C = C * A.
/=Оператор деления с присваиванием присваивает левому операнду результат деления левого операнда на правый операнд.C /= A эквивалентно C = C / A.
%=Оператор деления по модулю с присваиванием, вычисляет остаток от деления двух операндов и присваивает его левому операнду.C %= A эквивалентно C = C % A.
<<=Оператор сдвига влево с присваиванием.C <<= 2 эквивалентно C = C << 2
>>=Оператор сдвига вправо с присваиванием.C >>= 2 эквивалентно C = C >> 2
&=Оператор побитового И с присваиванием.C &= 2 эквивалентно C = C & 2
^=Оператор побитового исключающего ИЛИ с присваиванием.C ^= 2 эквивалентно C = C ^ 2
|=Побитовый оператор ИЛИ с присваиванием.C |= 2 эквивалентно C = C | 2

Пример

См. пример ниже, чтобы понять все операторы присваивания, доступные в C#:

Пример

using System;

namespace OperatorsAppl
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 21;
            int c;

            c = a;
            Console.WriteLine(Строка 1 - = значение c = {0}, c);

            c += a;
            Console.WriteLine(Строка 2 - += значение c = {0}, c);

            c -= a;
            Console.WriteLine("Строка 3 - -= значение c = {0}", c);

            c *= a;
            Console.WriteLine("Строка 4 - *= значение c = {0}", c);

            c /= a;
            Console.WriteLine(Строка 5 - /= значение c = {0}, c);

            c = 200;
            c %= a;
            Console.WriteLine(Строка 6 - %= значение c = {0}, c);

            c <<= 2;
            Console.WriteLine(Строка 7 - <<= значение c = {0}, c);

            c >>= 2;
            Console.WriteLine(Строка 8 - >>= значение c = {0}, c);

            c &= 2;
            Console.WriteLine(Строка 9 - &= значение c = {0}, c);

            c ^= 2;
            Console.WriteLine(Строка 10 - ^= значение c = {0}, c);

            c |= 2;
            Console.WriteLine(Строка 11 - |= значение c = {0}, c);
            Console.ReadLine();
        }
    }
}

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

Line 1 - =     c 的值 = 21
Line 2 - +=    c 的值 = 42
Line 3 - -=    c 的值 = 21
Line 4 - *=    c 的值 = 441
Line 5 - /=    c 的值 = 21
Line 6 - %=    c 的值 = 11
Line 7 - <<=    c 的值 = 44
Line 8 - >>=    c 的值 = 11
Line 9 - &=    c 的值 = 2
Line 10 - ^=    c 的值 = 0
Line 11 - |=    c 的值 = 2

Другие операторы

В следующей таблице перечислены некоторые другие важные операторы, поддерживаемые C#, включаяsizeof、typeofи? :。

ОператорыОписаниеПример
sizeof()Возвращает размер типа данных.sizeof(int) вернёт 4.
typeof()Возвращает тип класса.typeof(StreamReader);
&Возвращает адрес переменной.&a; получит фактический адрес переменной.
*Указатель на переменную.*a; указывает на переменную.
? :Условное выражениеЕсли условие истинно ? то X : иначе Y
являетсяОпределяет, относится ли объект к определённому типу.If( Ford is Car) // Проверяет, является ли Ford объектом класса Car.
asПриведение типов, даже если преобразование не удастся, не вызовет исключения.Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;

Пример

Пример

using System;

namespace OperatorsAppl
{
   
   class Program
   {
      static void Main(string[] args)
      {
         
         /* Пример оператора sizeof */
         Console.WriteLine("Размер int равен {0}", sizeof(int));
         Console.WriteLine("Размер short равен {0}", sizeof(short));
         Console.WriteLine("Размер double равен {0}", sizeof(double));
         
         /* Пример тернарного оператора */
         int a, b;
         a = 10;
         b = (a == 1) ? 20 : 30;
         Console.WriteLine("Значение b равно {0}", b);

         b = (a == 10) ? 20 : 30;
         Console.WriteLine("Значение b равно {0}", b);
         Console.ReadLine();
      }
   }
}

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

int 的大小是 4
short 的大小是 2
double 的大小是 8
b 的值是 30
b 的值是 20

Ключевое слово typeof используется для получения объекта типа; оно обычно используется для рефлексии и динамического создания экземпляров типов.

Вот простой пример использования typeof:

Пример

using System;

class Program
{
    static void Main(string[] args)
    {
        Type type = typeof(string);
        Console.WriteLine(type.FullName);
        Console.ReadKey();
    }
}

В приведённом выше коде мы используем ключевое слово typeof для получения объекта типа string и сохраняем его в переменной type типа Type. Затем мы используем свойство FullName для вывода полного имени этого типа.

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

System.String

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

Приоритет операторов определяет группировку членов в выражении. Это влияет на то, как вычисляется выражение. Некоторые операторы имеют более высокий приоритет, чем другие. Например, операторы умножения и деления имеют более высокий приоритет, чем операторы сложения и вычитания.

Например, x = 7 + 3 * 2, здесь x присваивается 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому умножение 3*2 вычисляется первым, а затем прибавляется 7.

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

Краткий обзор приоритета.: Сначала скобки, затем умножение/деление, затем сложение/вычитание, затем сдвиги, затем отношения, затем логические, затем условные, и наконец, запятая., 。

Категория ОператорыАссоциативность
Постфиксные() [] -> . ++ - -   Слева направо
Унарные + - ! ~ ++ - - (type)* & sizeof  Справа налево
Мультипликативные * / % Слева направо
Аддитивные+ -  Слева направо
Сдвиг << >>  Слева направо
Связь< <= > >=  Слева направо
Равенство == !=  Слева направо
Побитовое И&  Слева направо
Побитовое XOR ^  Слева направо
Побитовое ИЛИ |  Слева направо
Логическое И&&  Слева направо
Логическое ИЛИ ||  Слева направо
Условия?:  Справа налево
Присваивание = += -= *= /= %=>>= <<= &= ^= |= Справа налево
comma ,  Слева направо

Пример

Пример

using System;

namespace OperatorsAppl
{
   
   class Program
   {
      static void Main(string[] args)
      {
         int a = 20;
         int b = 10;
         int c = 15;
         int d = 5;
         int e;
         e = (a + b) * c / d;     // ( 30 * 15 ) / 5
         Console.WriteLine(Значение (a + b) * c / d равно {0}, e);

         e = ((a + b) * c) / d;   // (30 * 15 ) / 5
         Console.WriteLine("Значение ((a + b) * c) / d равно {0}", e);

         e = (a + b) * (c / d);   // (30) * (15/5)
         Console.WriteLine("Значение (a + b) * (c / d) равно {0}", e);

         e = a + (b * c) / d;    //  20 + (150/5)
         Console.WriteLine(Значение a + (b * c) / d равно {0}, e);
         Console.ReadLine();
      }
   }
}

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

(a + b) * c / d 的值是 90
((a + b) * c) / d 的值是 90
(a + b) * (c / d) 的值是 90
a + (b * c) / d 的值是 50

Приоритет арифметических операторов и операторов присваивания:

Пример

int a = 10, b = 5, c = 2;
int result = a + b * c;  // Сначала вычисляется умножение, затем сложение
Console.WriteLine(result);  // вывод 20

result = (a + b) * c;     // Сначала вычислите сложение, затем умножение
Console.WriteLine(result);  // вывод 30

a += b * c;               // Сначала вычислите умножение, затем выполните присваивание сложения
Console.WriteLine(a);       // вывод 20

Приоритет логических операторов:

Пример


bool a = true, b = false, c = true;
bool result = a || b && c;  // Сначала вычислите операцию AND, затем операцию OR
Console.WriteLine(result);  // Вывод true

result = (a || b) && c;     // Сначала вычислите операцию OR, затем операцию AND
Console.WriteLine(result);  // Вывод true

result = a || (b && c);     // Сначала вычислите операцию AND, затем операцию OR
Console.WriteLine(result);  // Вывод true

Приоритет условных операторов:

Пример

int a = 10, b = 5;
string result = a > b ? "a больше b" : "a не больше b";  // Сначала определите соотношение величин, затем выполните условный оператор
Console.WriteLine(result);  // Вывод "a больше b"

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

Другие расширения