表达式和运算符

表达式和运算符

表达式

具有一个或多个操作数, 零个或多个运算符, 可以计算且结果为单个值、对象、方法或命名空间的代码片段。
i++; 其中i为操作数, ++为运算符

运算符

按操作数可以分为

  • 一元运算符(++, new)
  • 二元运算符(+, -, *, /)
  • 三元运算符(条件运算符?:, 唯一一个三元运算符)

按操作类型可以分为

类型 符号表示
基本运算符 X.y, f(x), a[x], x++, x--, new, typeof, checked, unchecked, default, delegate
一元运算符 +, -, !, ~, ++x, --x, (T)x
乘除运算符 *, /, %
加减运算符 +, -
移位运算符 <<, >>
关系和类型检测运算符 <, >, <=, >=, is, as
相等运算符 ==, !=
逻辑运算符 &, ^, |
条件运算符 &&, ||, ?:
赋值运算符 =, +=, -=, *=, /=, %=, &=,

其优先级从上到下依次增强, 相同优先级情况下, 左结合运算符从左到右顺序计算, 右结合运算符从右到从顺序计算. 在所有运算符当中, 赋值运算符和三元运算符是右结合运算符, 其他所有二元运算符都是左结合运算符. 建议多用括号进行优先级标记.

另一点需要注意的是,相等运算符对于值类型数据的判断,判断依据是两个操作数的值是否相等。而对于引用类型的操作数而言,大多数情况下比较的是它们的引用,而不管它们引用的对象。但也有例外,string类型是引用类型,但string类型之间比较的是字符串长度和它们的值(因为在string中的相等运算符进行了重载,实际使用的是equal),其中值是大小写敏感的。

运算符重载

所有运算符重载均为类的静态方法,且必须使用public进行修饰

//一元运算符重载

public static 自定义类型 operator 要重载的运算符(类型)

public static OperatorSample operator +(OperatorSample obj)

//二元运算符重载

public static 自定义类型 operator 要重载的运算符(类型1,类型2)

public static OperatorSample operator +(OperatorSample obj1, OperatorSample obj2)

以下必须成对重载

  • ==, !=

  • <, >

  • <=, >=

可重载的运算符

一元运算符:+, -, !, ~, ++, --, true, false

二元运算符:+, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=

条件逻辑运算符不能重载,但可使用能够重载的&和|进行计算, 数组索引运算符不能重载,但可定义索引器, 转换运算符不能重载, 但可定义新的转换运算符(使用explicit和implicit关键字)

不能重载的运算符

=, ., ?:, ->, new, is, sizeof, typeof

原文地址:https://www.cnblogs.com/home-wang/p/10943387.html