运算
一、四则运算,赋值运算
+,-,*,/,%
取余的结果符号和 % 左边的数保持一致
强制转换:不会改变原有数据的类型和值`
double d = 1.7;
int a = 10;
a = (int)d;
printf ("a = %d, d = %.1f\n", a, d);
a=1,d=1.7
隐式转换的规则:char --> short —> int, float ----> double, 整型 ----> 浮点型
例:
printf ("%lu\n", sizeof(10+2.0));
printf ("%lu\n", sizeof(10+2.0f));
int a = 10;
a = a + 2.0;
printf ("%lu\n", sizeof(a));
输出8,4,4
10+2.0转化为double类型
10+2.0f转化为float类型
a仍为int类型
例:
int a = 5;
a += a -= a*a;
printf ("a = %d\n", a);
int x = 8;
x *= x-= x+=x;
printf ("x = %d\n", x);
a = -40,x = 0
a=a+(a-=aa)对括号内计算a=a-aa=-20
即a=a+a(a=-20)
a=-40
二,关系运算
关系运算符结果要么真,要么假
真 用 1 表示, 真 的值是1 :非0都叫真
假 用 0 表示,假 的值是0 :只有0才是假
逻辑表达式:有一个短路规则
对于逻辑与 && :如果左边不成立,则右边表达式将不执行
对于逻辑或 || :如果左边成立,则右边不执行
例:
printf ("%d\n", (2>3 && 6>5));
int a = 10;
int b = 20;
a && (b = 30);
b || (a = 40);
printf ("a = %d, b = %d\n", a, b);
return 0;
a = 10, b = 30
!:对表达式的值进行取反 将真变为假,将假变为真
例:
int a = 10;
int b = 20;
!a && (b = 30);
!b || (a = 40);
printf ("a = %d, b = %d\n", a, b);
a = 40, b = 20
三,三目运算符(条件运算符)
A?B:C
如果A 成立, 则表达式的结果为 B 的结果
如果A不成立,则表达式的结果为 C 的结果
逗号运算符,结果是最后一个表达式的结果
int a = 10;
int b = 20;
int c = (a>b?a:b)+10;
int d = 40;
a<b?(a=1):c>d?(c=2):(d=3);
printf ("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
int e = (a+3, b+4, c+5,d+10);
printf ("e = %d\n", e);
a = 1, b = 20, c = 30, d = 40
e = 50
五、自增自减
a++ 先参与运算,再自增
++a 先自增,再参与运算
int x=8,y,z;
y = (++x) + (x++) + (++x);
z = (--x) + (x--) + (++x);
printf("y=%d, z=%d, x=%d\n", y, z, x);
在不同操作系统下结果不同
ubuntu : y=30, z=29, x=10
红帽: y=28, z=31, x=10
windows: y=30, z=33, x=10
对于Windows下的运算顺序:
1、先将表达式中所有前置的运算做完
2、当表达式运行结束后再将所有后置的运算做完
六、位运算
按位与 &, 可以对数据的某些位清0
按位或 |,可以对数据的某些位置1
按位异或^ :相同为0,不同为1,将某些位进行翻转(用1)
按位取反~
左移运算 << :往左移动n位 等价于乘以 2的n次方,移动的过程中,低位补0,高位舍弃
右移运算 >> :往右移动n位 等价于除以 2的n次方,移动的过程中,低位舍弃,高位按符号为补
运算优先级(从高到底)
四则运算
关系运算(大小比较>相等比较)
赋值运算