表达式和运算符
表达式
具有一个或多个操作数, 零个或多个运算符, 可以计算且结果为单个值、对象、方法或命名空间的代码片段。
如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