牢记:只要是表达式,就有一个计算结果。
运算符优先级:
1.算术运算符: + - * / % ( )
相反数运算符:-
int a = 3 + 5 * 6 * 7 / 8 % 5 + 7 - 9;
赋值语句 从左往右算的过程叫结合性 先算*/%叫优先级
先考虑优先级在考虑结合性
取相反数:printf("%d\n", -(-a));
求余数的方法:见代码
printf("%d......%d\n", 9 / 2, 9 % 2);
printf("%d......%d\n", -9 / 2, -9 % 2);
printf("%d......%d\n", 9 / -2, 9 % -2);
printf("%d......%d\n", -9 / -2, -9 % -2);
2.赋值类运算:
基本赋值运算符: =
int a = 3;
int b, c, d, e;
b = c = d = e = a;
从右到左算的
赋值表达式的计算结果:左侧变量的最终值
复合赋值运算符:+= -= *= /= %=
a += 5;//相当于a = a + 5
b += b *= 5;//不建议这么写 引起人的不适,好代码自带阅读
自增减赋值运算符:++ --
a = b = 10;
//++语句 不区分写法
/*a++;
++b;*/
//++表达式 需要区分写法。
//a 10 b 10 d 3 e 3
d = a++;//分析++表达式的值 a++先给后加
e = ++b;//++b先加后给 谁在前谁优先
//a 11 b 11 d 10 e 11
这里要注意,a++是先给后加,会把a本身的值给到左侧然后在自增。而++b则是先加后给,会先自增然后再把值赋给左侧。
3.关系运算
大于 > 大于等于>= 小于< 小于等于<=
printf("%d %d\n", 3 > 5, 3 <= 5);
printf("%d\n", 1 <= 4 && 4 <= 10);//区间关系 不能写成1<=4<=10
等于== 不等于 !=
printf("%d\n", 3 > 5 == 5 < 9);
printf("%d\n", 3 > 5 != 5 < 9);
4.逻辑运算
逻辑非not ! 逻辑与and && 逻辑或or ||
int a = 8;
printf("%d\n", !!!!a);//! 计算结果:相反逻辑 0跟非0
printf("%d\n", 1 && 2);
printf("%d\n", 1 && 0);
printf("%d\n", 0 && 2);
printf("%d\n", 0 && 0);//全真则真 有假则假
printf("%d\n", 1 || 2);
printf("%d\n", 1 || 0);
printf("%d\n", 0 || 2);
printf("%d\n", 0 || 0);//全假则假 有真则真
&&全真则真,一假即假;||全假则假,一真即真
&&优先级略高于||
&& || 的短路问题:
int m, n;
m = 10, n = 10;
printf("%d\n", m++ > 10 && ++n > 10);
printf("m=%d n=%d\n", m, n);
&& ||结构优先
&&如果发现左边为假,则不会继续进行右边运算
同样,||如果发现左侧为真,则不会进行右边运算
这种现象称为短路问题
5.三目运算符
int a=10;
char r ;
if (a%2==0)
{
r='T';
}
else
{
r='F';
}
r = a % 2 == 0 ? 'T' : 'F';
以上两段代码意义相同
6.位运算
位 运算: 站在机器角度的 二进制计算 (0 1序列)
按位 与 &
printf("%d %d\n", 10 & 5, 0b00001010 & 0b00000101);
变为二进制后全1则1,有0就0
按位 或|
printf("%d %d\n", 10 | 5, 0b00001010 | 0b00000101);
有1则1,全0则0
按位 取反~
printf("%u %d\n",~0,~-1);
0变1,1变0
按位 异或 ^
printf("%d %d\n", 10 ^ 5, 0b11111111 ^ 0b11111111);
相同则0 不同就1
加密:密文LOVE 明文JIPC 密钥 6
char ch;
for (int i=0;i<4;i++)
{
scanf_s("%c", &ch,1);
printf("%c", ch ^ 6);
}
按位 左移<<
printf("\n%d\n", 10 << 1);
二进制左移一位,实质上就是十进制乘2
按位 右移>>
printf("%d\n", 10 >> 2);
二进制右移一位,实质上就是十进制除以2
printf("%d\n", -1>>100);//1111 1111 1111 1111 1111 1111 1111 1111
printf("%hhd\n", (unsigned char)-1 >> 2);
-1按位右移多少位结果还是-1
右移时负数补1,非负数补0
7.其他运算符
sizeof(表达式):
用来计算字节长度
, 运算符:
printf("%d\n", (1, 2, 3, 4, 5));//最右侧的表达式值 作为 逗号表达式的值。
int a, b, c;
a = 5, b = a++, c = 1 + b;
int d = (a = 5, b = a++, c = a + b);
printf("%d", d);
最右侧的表达式值 作为 逗号表达式的值。
逗号的应用场景:for循环的增量表达式
for (int i = 0, j = 0; i < 10; i++, j++)
{
}
& 取地址运算符
* 取地址的值运算符
这两个在学习指针之后自然会明白!