1.[]运算符
方括号([])用于数组、索引器和属性,也可用于指针。
用于数组:数组类型是一种后跟[]的类型。
int
[] fib
=
new
int
[
100
];
//
声明一个有100个元素的int数组
若要访问数组的一个元素,则用方括号括起所需元素的索引。
fib[
0
]
=
fib[
1
]
=
1
;
for
(
int
i
=
2
;i
<
100
;
++
i) fib[i]
=
fib[i
-
1
]
+
fib[i
-
2
];
//
如果索引超出范围,则会引发异常
不能重载数组索引运算符,但类型可定义采用一个或多个参数的索引器和属性。索引器参数括在方括号中,但索引器参数可声明为任何类型(数组索引必须为整数)。
System.Collections.Hashtable h
=
new
System.Collections.Hashtable();
h[
"
a
"
]
=
123
;
//
string类型索引
方括号还用于指定属性:
[attribute(AllowMultiple
=
true
)]
//
允许属性多次附加到指定类型上
public
class
Attr
{
}
可以使用方括号来指定指针索引:
unsafe
fixed
(
int
*
p
=
fib )
{
p[
0
]
=
p[
1
]
=
1
;
for
(
int
i
=
2
; i
<
100
;
++
i ) p[i]
=
p[i
-
1
]
+
p[i
-
2
];
}
不执行边界检查。
2.()运算符
除了用于指定表达式中的运算符顺序、创建对象外,圆括号还用于指定强制转换或类型转换:
double
x
=
1234.7
;
int
a;
a
=
(
int
)x;
//
double转换为int
强制转换显式调用从一种类型到另一种类型的转换运算符。不能重载()运算符。如果未定义这样的运算符,则强制转换将失败。强制转换表达式可能导致不明确的语法。
3..运算符
点运算符(.)用于成员访问、指定类型或命名空间的成员。例,点运算符用于访问.NET Framework类库中的特定方法:
System.Console.WriteLine(
"
hello
"
);
4.::运算符
命名空间别名限定符运算符用于查找标识符,它通常放置在两个标识符直接,如:
global
::System.Console.WriteLine(
"
Hello World
"
);
//
调用全局命名空间中的查找,而不是在别名命名空间中
5.+运算符
+运算符既可作为一元运算符也可作为二元运算符。
一元+运算符是为所有数值类型预定义的,对值类型进行一元+运算的结果就是操作数的值。
二元+运算符是为数值类型和字符串类型预定义的,对于数值类型,+计算两个操作数之和,当一个操作数或两个操作数是字符串类型时,+将操作数的字符串表示形式串联在一起。
委托类型也提供二元+运算符,该运算符执行委托串联。
用户定义的类型可重载+运算符。在枚举时通常允许整形运算。
代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
Console.WriteLine(
+
5
);
//
结果为:5
7
Console.WriteLine(
5
+
5
);
//
结果为:10
8
Console.WriteLine(
5
+
.
5
);
//
结果为:5.5
9
Console.WriteLine(
"
5
"
+
"
5
"
);
//
结果为:55
10
Console.WriteLine(
5.0
+
"
5
"
);
//
结果为:55
11
}
12
}
6.-运算符
-运算符既可作为一元运算符也可作为二元运算符。
一元-运算符是为所有数值类型预定义的,结果是操作数的反数。
二元-运算符是为所有数值类型和枚举类型预定义的,其功能是从一个操作数中减去第二个操作数。
委托类型也提供二元-运算符,该运算符执行委托移除。
用户定义的类型可重载-运算符;
代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
int
a
=
5
;
7
Console.WriteLine(
-
a);
//
结果为:-5
8
Console.WriteLine(a
-
1
);
//
结果为:4
9
Console.WriteLine(a
-
.
5
);
//
结果为:4.5
10
}
11
}
12
7.*运算符
乘法运算符(*),用于计算操作数的积、取消引用运算符,允许读取和写入指针。
所有数值类型都具有预定义的乘法运算符。
*运算符用来声明指针类型和取消引用指针(间接寻址运算符)。该运算符只能在不安全的上下文中使用,通过unsafe关键字来表示。
代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
Console.WriteLine(
5
*
2
);
//
结果为:10
7
Console.WriteLine(
-
.
5
*
.
2
);
//
结果为:-0.1
8
Console.WriteLine(
-
.5m
*
.2m);
//
结果为:-0.10
9
}
10
}
11
8./运算符
除法运算符(/)用第二个操作数除第一个操作数,所有数值类型都具有预定义的除法运算符。
代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
Console.WriteLine(
-
5
/
2
);
//
结果为:-2
7
Console.WriteLine(
-
5.0
/
2
);
//
结果为:-2.5
8
}
9
}
10
9.%运算符
模运算符(%)计算第二个操作数除第一个操作数后的余数。所有数值类型都具有预定义的模运算符。代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
Console.WriteLine(
5
%
2
);
//
结果为:1
7
Console.WriteLine(
-
5
%
2
);
//
结果为:-1
8
Console.WriteLine(
5.0
%
2.2
);
//
结果为:0.6
9
Console.WriteLine(
5.0m
%
2.2m
);
//
结果为:0.6
10
Console.WriteLine(
-
5.2
%
2.0
);
//
结果为:-1.2
11
}
12
}
13
10.&运算符
&运算符既可作为一元运算符也可作为二元运算符。
一元&运算符返回操作数的地址(要求unsafe上下文)。
为整型和bool类型预定义了二进制&运算符。对于整型,&计算操作数的逻辑按位“与”。对于bool操作数,&计算操作数的逻辑“与”,即当且仅当两个操作数均为true,结果为true。
代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
int
i
=
0
;
7
if
(
false
&
++
i
==
1
)
8
{
9
//
...
10
}
11
Console.WriteLine(
true
&
false
);
//
结果为:false
12
Console.WriteLine(
true
&
true
);
//
结果为:true
13
Console.WriteLine(
"
0x{0:x}
"
,
0xf8
&
0x3f
);
//
结果为:0x38
14
}
15
}
16
11.|运算符
二元|运算符是为整型和bool类型预定义的。对于整型,|计算操作数的按位“或”结果。对于bool操作数,|计算操作数的逻辑“或”结果,也就是说,当且仅当两个操作数均为false,结果才为false。
代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
Console.WriteLine(
true
|
false
);
//
结果为:true
7
Console.WriteLine(
false
|
false
);
//
结果为:false
8
Console.WriteLine(
"
0x{0:x}
"
,
0xf8
|
0x3f
);
//
结果为:oxff
9
}
10
}
11
12.^运算符
二元^运算符是为整型和bool类型预定义的。对于整型,^将计算操作数的按位“异或”。对于bool操作数,^将计算操作数的逻辑“异或”;也就是说,当且仅当只有一个操作数为true时,结果才为true。
代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
Console.WriteLine(
true
^
false
);
//
结果为:true
7
Console.WriteLine(
false
^
false
);
//
结果为:false
8
//
Bitwise exclusive-or:
9
Console.WriteLine(
"
0x{0:x}
"
,
0xf8
^
0x3f
);
//
结果为:oxc7
10
}
11
}
13.!运算符
逻辑非运算符(!)是对操作数求反的一元运算符,为bool定义了该运算符,当且仅当操作数为false时才返回true。
14.~运算符
~运算符对操作数执行按位求补运算,其效果相当于反转每一位。按位求补运算符是为int、uint、long、ulong预定义的。
代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
int
[] values
=
{
0
,
0x111
,
0xfffff
,
0x8888
,
0x22000022
};
7
foreach
(
int
v
in
values)
8
{
9
Console.WriteLine(
"
~0x{0:x8} = 0x{1:x8}
"
, v,
~
v);
10
}
11
/*
12
结果:
13
~0x00000000 = 0xffffffff
14
~0x00000111 = 0xfffffeee
15
~0x000fffff = 0xfff00000
16
~0x00008888 = 0xffff7777
17
~0x22000022 = 0xddffffdd
18
*/
19
}
20
}
15.=运算符
赋值运算符(=)将右操作数的值存储在左操作数表示的存储位置、属性或索引器中,并将值作为结果返回。操作数的类型必须相同(或右边的操作数必须可以隐式转换为左边操作数的类型)。
16.<运算符
所有数值类型和枚举类型都定义“小于”关系运算符<。如果第一个操作数小于第二个操作数,返回true,否则返回false。
用户定义的类型可重载<运算符,如果重载<运算符,则必须重载>。重载二元运算符时,会隐式重载相应的赋值运算符。
17.>运算符
所有数值类型和枚举类型都定义“大于”关系运算符>,如果第一个操作数大于第二个操作数,返回true,否则返回false。
用户定义的类型可重载>运算符,如果重载>运算符,则必须重载<。重载二元运算符时,会隐式重载相应的赋值运算符。
18.?:运算符
条件运算符(?:)根据bool类型表达式的值返回两个值中的一个。格式如下:
condition
?
first_expression : second_expression;
如果条件为true,则计算第一表达式并以它的计算结果为准;如果为false,则计算第二表达式并以它的计算结果为准。只计算两个表达式中的一个。
代码
1
using
System;
2
class
MainClass
3
{
4
static
double
sinc(
double
x)
5
{
6
return
x
!=
0.0
?
Math.Sin(x)
/
x :
1.0
;
7
}
8
9
static
void
Main()
10
{
11
Console.WriteLine(sinc(
0.2
));
//
结果为:0.993346653975306
12
Console.WriteLine(sinc(
0.1
));
//
结果为:0.998334166468282
13
Console.WriteLine(sinc(
0.0
));
//
结果为:1
14
}
15
}
19.++运算符
增量运算符(++)将操作数加1。增量运算符可以出现在操作数之前或之后。
如果是前缀增量操作符,该操作的结果是操作数加1之后的值。
如果是后缀增量操作符,该操作的结果是操作数增加之前的值。
数值类型和枚举类型具有预定义的增量运算符。用户定义的类型可重载++运算符。
代码
1
using
System;
2
class
MainClass
3
{
4
static
void
Main()
5
{
6
double
x;
7
x
=
1.5
;
8
Console.WriteLine(
++
x);
//
结果为:2.5
9
x
=
1.5
;
10
Console.WriteLine(x
++
);
//
结果为:1.5
11
Console.WriteLine(x);
//
结果为:2.5
12
}
13
}
20.--运算符
减量运算符(--)将操作数减1。
前缀减量运算符运算的结果是操作数减小“之后”的值,后缀减量运算符的结果是操作数减小“之前”的值。
(未完待续)