第六次课-----运算符与表达式
一、运算符和表达式
运算符:+ - * / %
表达式:由操作数和运算符组成的式子,如 a-b,1+2
C语言中单一的一个变量或者单一的一个常量是最简单的表达式
提问:以下程序是输出变量的值还是表达式的值?
int main(void)
{
char a = 0;
char b = 0;
a = 10;
b = 15;
printf("%d",a);
printf("%d\n",a+b);
}
总结:永远输出表达式的值!!!
1.优先级与结合性
优先级:参照附录C P359 从1开始逐渐减弱
结合性:同一优先级时,从左到右或者从右到左的运算顺序。
2.单目、双目和三目运算符
单目运算符:运算对象只有1个,如:++ -- !
双目运算符:运算符两侧各有一个运算对象,如: + - * /
三目运算符:运算对象有三个,如: ? :
表达式1 ? 表达式2 : 表达式3
10 < 15 ? 10 : 15
3.算术运算符和算术运算表达式:+ - * / %
+ - * /:只要有一个运算对象是浮点型,则表达式的值为double型。
int main(void)
{
float a = 0;
float c = 0;
a = 7.5;
c = 7 / 2.0;//c = 3.500000000000000
printf("%f\n", c);//14
}
%求余运算符:两个运算对象必须都是整数!
20 % 6.5//错误,不能是小数
自增++ 自减--
++后缀:先读后写
int main(void)
{
int a = 0;
a = 20;
a++;//相当于a = a + 1; 21
printf("%d\n", a++);//先读后写,先把a 的值(21)读出来,再a = a + 1;
printf("%d\n", a);//22
}
printf("%d\n", a++);
相当于
printf("%d\n", a);
a = a + 1;
++前缀:先写后读
int main(void)
{
int a = 0;
a = 20;
++a;//相当于a = a + 1; a = 21
printf("%d\n", ++a);//先写后读,先a = a + 1;再把a的值(22)读出来
printf("%d\n", a);//22
}
printf("%d\n", ++a);
相当于
a = a + 1;
printf("%d\n", a);
4.关系运算符和关系运算表达式:> < == >= <= !=
关系运算表达式的值为“真”或者“假”用“1”和“0”表示。
int a = 15;
int b = 10;
a > b//1
a < b//0
a < 15//0
a > 15//0
a >= 15//1
a == 15//1
a == b//0
a != b//1
5.逻辑运算符和逻辑运算表达式
逻辑运算表达式的值为“真”或者“假”用“1”和“0”表示。
参与运算的对象只要不为0,则运算对象为真。
&&逻辑与运算符:参与运算的对象都为真(不为0),结果才是真。
int a = 15;
int b = 10;
a > b && a < b//0
a > b && a != b//1
a && b//1
||逻辑或运算符:参与运算的对象只要有一个为真(不为0),结果就是真,只有两个都是假的,结果才是假。
int a = 15;
int b = 10;
a > b || a < b//1
a > b || a != b//1
a < b || a == b//0
a || b//1
!逻辑非运算符:使表达式的值由真变假,由假变真
int a = 15;
int b = 10;
!(a > b)//0
!(a < b)//1
!a//0
6.赋值运算符和赋值运算表达式:
简单赋值运算符:=
变量 = 表达式;
a = 45;
复合的赋值运算符: += -= *= /= %=
int a = 15;
a += 10;//a = a + 10; a = 25;
a -= 10;//a = a - 10; a = 15;
a *= 2;//a = a*2; a = 30;
a /= 2;//a = a/2; a = 15;
a %= 6;//a = a % 6; a = 3;
a++;//相当于a += 1;
a / = 10;//错误,不能有空格
7.逗号运算符和逗号运算表达式:,
表达式1,表达式2,表达式3,...
逗号表达式的最终值是最后一个表达式的值,但是所有的表达式都会运行。
int main(void)
{
int a = 0;
int b = 0;
int c = 0;
a = 5;
b = 15;
c = 10;
printf("%d\n", (++a, ++b, c++));//10
printf("%d\n",a);//6
printf("%d\n", b);//16
}
8.sizeof求字节运算符
sizeof(表达式) 结果为表达式的数据类型占据的字节数
int a = 10;
sizeof(int)//4
sizeof(unsigned int)//4
sizeof(a)//4
sizeof(165)//4
sizeof(a + 10)//4
sizeof(float)//4
sizeof(double)//8
sizeof(long double)//8
9.强制类型转换运算符:(类型名)(表达式)
int main(void)
{
float a = 0;
int b = 0;
int c = 0;
float d = 0;
a = 7.5;
b = 2;
d = 1.5;
c = a * b;//c = 15.000 000 000 000 000;
printf("%d\n", c);//15
c = (int)a * b;//c = 7*2;
printf("%d\n", c);//14
c = (int)(a * b);//c = 15;
printf("%d\n", c);//15
c = a*b*d;//c = 22.5; c = 22
printf("%d\n", c);//22
c = (int) a*b*d;
printf("%d\n", c);//21
c = (int)a*b*(int)d;
printf("%d\n", c);//14
}
10.不同类型的数据混合运算时为了保证运算的精度,计算机会自动转向精度高的数据类型进行转换 char 一定会转换为int
float 一定会转换为double
char b = 0;
float c = 0;
char d = 'M';
b = 'A'+ 32;//b = 65+32;
c = 7 / 2.0f;//c = 3.500 000 000 000 000;
//7.000 000 000 000 000 /2.000 000 000 000 000