表达式及运算
1. 表达式
—个表达式是一系列运算符和算子的组合,用来计算一个值。
eg:
amount = a * (1 + b);
表达式包括运算符(operator)和算子(operand)。运算符是指进行运算的动作,比如加法运算符+
,减法运算符-
。算子是指参与运算的值,这个值可能是常数,也可能是变量,还可能是一个方法的返回值。
eg:输入两个时间,每个时间分别输入小时和分钟的值,然后输出两个时间之间的差,也以几小时几分表示:
#include "stdio.h"
int main(){
int hour1,min1;
int hour2,min2;
scanf("%d %d",&hour1,&min1);
scanf("%d %d",&hour2,&min2);
// 将时间换算成分钟
int t1 = hour1 * 60 + min1;
int t2 = hour2 * 60 + min2;
int t = t2 - t1;
printf("时间差是%d小时%d分。", t / 60, t % 60); // t/60->小时部分,t%60->分钟部分
return 0;
}
2. 运算符的优先级
写一个程序,输入两个整数,输出他们的平均值:
#include "stdio.h"
int main(){
int a, b;
scanf("%d %d", &a, &b);
double c = (a + b) / 2.0;
printf("%d和%d的平均值为%f\n", a, b, c);
return 0;
}
运算符的优先级如下:
优先级 | 运算符 | 运算 | 结合关系 | 举例 |
---|---|---|---|---|
1 | + | 单目不变 | 自右向左 | a*+b |
1 | - | 单目取负 | 自右向左 | a*-b |
2 | * | 乘 | 自左向右 | a*b |
2 | / | 除 | 自左向右 | a/b |
2 | % | 取余 | 自左向右 | a%b |
3 | + | 加 | 自左向右 | a+b |
3 | - | 减 | 自左向右 | a-b |
4 | = | 赋值 | 自右向左 | a=b |
注:赋值也是运算,也有结果
eg:a=6
的结果是a
被赋予的值,也就是6
eg:a=b=6
→a=(b=6)
嵌入式赋值:
int a = 6;
int b;
int c = 1 + (b = a);
嵌入式赋值不利于阅读,容易产生错误,不建议使用。
3. 交换两个变量
如果已经有:
int a = 6;
int b = 5;
如何交互a
、b
两个变量的值?
思路:定义一个新的变量t
,先将a
的值赋给t
,这样a
就空出来了,再将b
的值赋给a
,最后将t
的值赋给b
,这样就完成了a
、b
两个变量值的交换,具体规程如下图所示:
代码如下:
#include "stdio.h"
int main(){
int a = 5;
int b = 3;
int t;
t = a;
a = b;
b = t;
printf("a=%d,b=%d", a, b);
return 0;
}
代码运行时,可以选择使用调试工具查看代码运行情况,在行前打上断点,点击调试按钮即可观察代码运行情况,如下图所示:
4. 复合赋值
5个算术运算符,+
、 -
、 *
、 /
、 %
,可以和赋值运算符=
结合起来,形成复合赋值运算符:+=
、-=
、*=
、/=
和%=
。
eg:
total += 5;
等价于total = total + 5;
注:两个运算符中间不要有空格!
递增递减运算符
++
和--
是两个很特殊的运算符,它们是单目运算符,这个算子还必须是变量。这两个运算符分别叫做递增和递减运算符,他们的作用就是给这个变量+1
或者-1
。
eg:
count++
等价于count += 1
→count = count + 1
前缀后缀:
++
和--
可以放在变量的前面,叫做前缀形式,也可以放在变量的后面,叫做后缀形式。
注:
a++
的值是a
加1
以前的值,而++a
的值是加了1
以后的值,无论哪个,a
自己的值都加了1
了。
具体见如下代码:
#include "stdio.h"
int main(){
int a;
a = 10;
printf("a++=%d\n", a++);
printf("a=%d\n", a);
printf("++a=%d\n", ++a);
printf("a=%d\n", a);
return 0;
}
结果如下:
a++
作为一个表达式的结果是a+1
以前的结果10
,做完a++
这个动作造成的结果就是a
变成了11
。在11
的基础上,++a
这个表达式的结果是12
,做完++a
这个动作后a
变成了12
。
注:前缀的结果是加
1
以后的,其副作用是使得a
的值加了1
。后缀的结果是加1
以前的,其副作用也是使得a
值加了1。
表达式 | 运算 | 表达式的值 |
---|---|---|
count++ | 给count 加1 | count 原来的值 |
++count | 给count 加1 | count+1 以后的值 |
count-- | 给count 减1 | count 原来的值 |
--count | 给count 减1 | count-1 以后的值 |
注:千万不要将复合赋值运算符和其他运算符放在一起使用,代码不易理解且易错!!!