您的位置:首页 > 移动开发 > Objective-C

Beginning C# Objects从概念到代码——1.9 C#表达式

2006-12-11 12:58 513 查看
简单的C#表达式有以下数种。

l 常量:7,false
l char(字符)引文:‘A’,‘&’
l string引文:“foo”
l 某种我们讨论过的预定义类型的变量名:myString,x
l 用C#二元操作符(本章稍后详述)连接的两个上述项:x+2
l 使用C#一元操作符(本章稍后详述)修改的一个上述项:i++
l 用括号包围的上述简单表达式:(x+2)
再加上我们在第13章将学到的其他一些表达式类型。
1.9.1 赋值语句
给变量赋值的操作,由赋值操作符=完成。一个赋值语句由放置在=左边的(已声明的)变量名,和=右边的能计算出类型合适的值的表达式组成。例如:

int count = 1;

total = total + 4.0; // 假定total被声明为双精度类型变量

price = cost + (a + b)/length; // 假定已正确声明所有变量
1.9.2 算术操作符
C#语言提供以下几种基本算术操作符:

+ 相加

- 相减
* 相乘
/ 相除

% 求模(%左边算子除以右边算子的余数)

+和-也可作为前缀,表示正数或负数:-3.7, +42。

除了简单赋值操作符=之外,还有一些特殊的组合赋值操作符,它们对变量进行组合赋值。用于算术操作的组合赋值操作符如下所列:

+= a += b 相当于 a = a + b.

-= a -= b 相当于 a = a - b.
*= a *= b 相当于 a = a * b.
/= a /= b 相当于 a = a / b.

%= a %= b 相当于 a = a % b.

组合赋值操作符并未增加新的功能;它们只为简化代码而存在。例如,
total=total+4.0
就可以被替代为
total += 4.0
最后要介绍两个算术操作符,递增(++)和递减(――)操作符,它们用于给整形变量加1或减1,或者给浮点型变量加1或减1。递增和递减操作符也可用于char变量。例如,考虑以下代码片段:

char c = 'e';
c++;
以上代码片段被执行时,变量c将被赋以值f,因为f是Unicode字符系列中e后面的字符。
递增和递减操作符可用作前缀或后缀。
如果操作符被放在被操作的变量前面(前缀),则递增或递减操作将发生于该语句中所有赋值操作之前。
如果操作符被放在被操作的变量后面(后缀),则递增或递减操作将发生于该语句中所有赋值操作之后。
例如,考虑以下代码片段,它使用了前缀递增(++)操作符:

int a = 1;
int b = ++a; // a的值将增加到2然后b被赋值2
两行代码都被执行后,变量a的值将是2,变量b的值也是。这是因为,在第二行代码中,对变量a的递增操作(从1到2)在a的值被赋给b之前发生。以上两行代码在逻辑上等同于下面三行代码:
int a = 1;
a = a + 1;
int b = a;
现在看看递增操作符在同一段代码中用作后缀的情况:

int a = 1;
int b = a++; // b将被赋值为1,然后a递增到2
在两行代码都被执行后,变量b的值将是1,而变量a的值则是2。这是因为,在第二行代码中,对变量a的递增操作(从1到2)发生于给b赋予变量a的旧值之后。上面两行代码逻辑上等同于下面三行代码:
int a = 1;
int b = a;
a = a + 1;
下面是稍为复杂一些的例子:

int y = 1;
int z = 2;
int x = y++ * ++z; // x将被赋值为3因为z的值在相乘之前
// 已经递增到3y的值在被使用前保持为1
如你稍后将见到的那样,递增和递减操作符常在循环和其他流程控制结构中使用。

1.9.3 求值表达式和操作符优先顺序
可以通过嵌套的括号来构造任意复杂的表达式,例如,((((4/x)+y)*7)+z)。编译器从内到外、从左到右计算逐对括号内的表达式。假定x、y和z已经被声明和初始化:

int x = 1;
int y = 2;
int z = 3;
则下面赋值语句右边的表达式:
int answer = ((8 * (y + z)) + y) * x;
将被渐次求值如下:
((8 * (y + z)) + y) * x
((8 * 5) + y) * x
(40 + y) * x
42 * x
42
如果没有括号,则有些操作符在被用于表达式求值时将获得较高执行优先权。例如,乘或除操作默认地先于加或减操作。操作符的自动优先权可通过使用括号显式地修改;括号内操作将先于括号外操作。考虑以下代码片段:

int j = 2 + 3 * 4; // j将被赋值14
int k = (2 + 3) * 4; // k将被赋值20
在第一行代码中,没有使用括号,乘法操作先于加法操作被执行,所以表达式求值结果为2+12=14;相当于显式地书写了“2+(3*4)”。

在第二行代码中,括号被显式地用来包围操作“2+3”,加法操作会首先被执行,其结果与4相乘,最后表达式求值为5*4=20。

1.9.4 逻辑操作符
逻辑操作符以特定方式比较两个(简单的或复杂的)表达式exp1和exp2,求得一个可能为true或false的布尔值。

要创建逻辑表达式,C#提供了以下关系操作符(relational operator):

exp1 == exp2 如果exp1等于exp2则为true(使用两个等于号)。

exp1 > exp2 如果exp1大于exp2则为true。
exp1 >= exp2 如果exp1大于或等于exp2则为true。
exp1 < exp2 如果exp1小于exp2则为true。
exp1 <= exp2 如果exp1小于或等于exp2则为true。
exp1 != exp2 如果exp1不等于exp2则为true (!读作“不”)。

!exp 如果exp为false则为true,如果exp为true则为false。

除了这些关系操作符,C#还提供了用于组合关系操作符,并创建包括多次比较的复杂逻辑表达式的逻辑操作符。

&& 逻辑“与”
|| 逻辑“或”

! 逻辑“非”(!操作符使逻辑表达式的值从true到false或相反)

逻辑“与”和“非”操作符是二元操作符;其左右两边的算子都必须是有效的逻辑表达式,这样才能计算得到布尔值。如果使用了&&操作符,左右两边的算子均应为true才能算得true。至于||操作符,则只要其中一个为true,结果就是true。

下例使用逻辑“与”操作符编写代码,表现“如果x大于2.0且y不等于4.0”:

if (x > 2.0 && y != 4.0) {
// 伪代码
do some stuff……
}
注意,因为>和!=操作符较&&操作符有更高优先级,我们无需像这样塞入括号:

if ((x > 2.0) && (y != 4.0)) {
// 伪代码
do some stuff ……
}
但这样做可以增强代码可读性。
逻辑表达式在控制结构流程中最为多见,本章稍后将谈及这个话题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: