表达式 表达式是一系列运算符和算子的组合,用来计算值。 运算符是运算的动作,算子是参与运算的值,可以是常数,可以是变量,也可以是一个返回值。
#include <stdio.h>
int main()
{
printf("计算两个时间差");
int hour1,minute1;
int hour2,minute2;
scanf("%d %d",&hour1,&minute1);
scanf("%d %d",&hour2,&minute2);
int t1=hour1 * 60 + minute1;
int t2=hour2 * 60 + minute2;
printf("时间差为%d小时%d分\n",(t2-t1)/60,(t2-t1)%60);
return 0;
}
$ cpp main.c -o main.ii
$ cc main.ii -o main
$ ./main
计算两个时间差1 50 2 10
时间差为0小时20分
Program exited with status 0
运算符优先级
#include <stdio.h>
int main()
{
int a;
int b;
scanf("%d %d",&a,&b);
double c= (a + b)/2.0;
printf("%d和%d的平均值是%f",a,b,c);
return 0;
}
$ cpp main.c -o main.ii
$ cc main.ii -o main
$ ./main
2 3
2和3的平均值是2.500000Program exited with status 0
双目运算符:在运算符左右有两个算子,如:5+6; 单目运算符:在运算符的右边有一个算子,如:-6。 ::: tip 单目运算符一般用于想要对某一个变量取负时,如想要取得变量a的相反数,取负操作是在变量a前加上一个单目运算符“-”。 单目运算优先级最高。 ::: 结合关系:相同优先级的运算中,除单目运算和赋值运算以外,均为自左向右。 ::: tip 单目运算符的算子一定出现在右边。 ::: ::: warning 避免“嵌入式赋值”
int a=6;
int b;
int c=1+(b=a);
“嵌入式赋值”不利于阅读且容易造成误解。 :::
交换变量 两个变量a=5,b=6,交换两个变量的值,如果采用a=b,b=a的方式,程序依次执行,最终结果是a=b=6。 ::: tip 程序表达动作而不是关系。 ::: 交换两个变量值需要引入第三个变量c。先将变量a的值暂存在变量c中,再把b的值赋给a,再把t的值赋给b。即:c=a;a=b;b=c。
复合赋值 “+-/%”五个算术运算符可以和赋值运算符“=”结合组成复合赋值运算符“+=、-=、=、/=、%=”。 ::: warning 复合赋值运算符中两个运算符之间没有空格。 :::
a += 5 + 9
a = a + (5 + 9)
a /= b + 6
a = a / (b + 6)
递增递减运算符 “++”和“--”是两个单目运算符,只能有一个算子,还必须是变量,分别叫做递增运算符和递减运算符。作用是让变量+1或-1。
count ++ ;
count += 1;
count = count + 1;
递增运算符和递减运算符可以放在变量的前面叫做前缀形式,也可以放在变量的后面叫做后缀形式。 ::: warning “a++”和“++a”,设a = 1。 a++是a加1以前的结果,指代先取a的值1再令a=a+1,附带作用是使得变量a的值+1变为2;(运算完后自增1) ++a是a加1以后的结果,指代先使a=a+1再取a的值2,附带作用是使得变量a的值+1变为2。(自增1后再运算) :::
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
printf("a++的值为%d\n",a++);
printf("a的值为%d\n",a);
printf("++a的值为%d\n",++a);
printf("a的值为%d\n",a);
return 0;
}
$ cpp main.c -o main.ii
$ cc main.ii -o main
$ ./main
10
a++的值为10
a的值为11
++a的值为12
a的值为12
Program exited with status 0
上述程序中输入a的初始值为10,通过每一步的输出值,后缀形式a++为a+1前的值10,但a已经+1变为11;前缀形式++a为a+1后的值,即11+1=12,此时的a的值也变为12。 ::: tip ++和--两个运算符可以单独使用,但不要组合进入表达式。 :::