本文内容看目录就对了
1.赋值运算符
=
赋值时发生隐士类型转换
第一类:较长的数据转化为较短的数据,精度缺失,发生截断,警告。
第二类:较短的数据转换为较长的数据,类型的提升,警告。
赋值时发生显示类型转换(强制转换)
(类型名)表达式
(int)a/b
2.算数运算符
单目运算符:+(正号)、-(负号)、++、–
双目运算符:+、-、*、/(符号两边要有两个操作数,如果操作数两边都是同一类型,则结果也是同一种类型)
后++ 后- -:先使用后运算
前++ 前- -:先运算后使用
3.关系运算符
关系 | 数学中的表示 | C语言的表示 |
---|---|---|
小于 | < | < |
小于等于 | ≤ | <= |
大于 | > | > |
大于等于 | ≥ | >= |
等于 | = | == |
不等于 | ≠ | != |
0为假 非0为真
int a=45,b=54,c=0;
c = a == b;//c=o
c=12<=a<=30;//c=1,为真,由于关系运算符不能连着写,运算符相同,从左往右运算
//12<=45 使其为1,1<=30,为真,故c=1.
4.逻辑运算符
逻辑与:&& 同真则真,一假则假
逻辑或:|| 同假则假,一真则真
逻辑非:! 真的变假,假的变真
#include<stdio.h>
int main()
{
int a=45,b=4,c=0;
c=(a=60)||(b=50);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;//输出a=60,b=4,c=1;
}
5.三目运算符
?:
表达式?语句1:语句2
如果表达式为真,就执行语句1,为假就执行语句2
#include<stdio.h>
int main()
{
int a = 45, b = 4, c = 0;
c = a < 10 ? printf("为真/n") : printf("为假\n");
printf("c=%d\n", c);
/*为假
c=5
printf函数的返回值是打印的字符数*/
return 0;
}
if(表达式)
…
else
…
6.位运算符与原码,反码,补码
原码,反码,补码
原码:计算出来的二进制
反码:负数:符号位不变,其余为按位取反
补码:负数:符号位不变,反码加1
正数:三码合一,原码,反码,补码相同
负数:正数符号位0,负数符号位1
真正计算机进行计算是补码进行计算,计算结果在转换成原码
负数补码转原码,将补码当做原码来做,继续取反加1
十进制 | 原码 | 反码 | 补码 |
---|---|---|---|
5 | 0000 0000 0000 0000 0000 0000 0000 0101 | 0000 0000 0000 0000 0000 0000 0000 0101 | 0000 0000 0000 0000 0000 0000 0000 0101 |
-5 | 1000 0000 0000 0000 0000 0000 0000 1101 | 1111 1111 1111 1111 1111 1111 1111 1111 1010 | 1111 1111 1111 1111 1111 1111 1111 1111 1011 |
几种常用的编码
十进制数 | 8421码 | 余3码 | 格雷码 | 2421码 | 5211码 |
---|---|---|---|---|---|
0 | 0000 | 0011 | 0000 | 0000 | 0000 |
1 | 0001 | 0100 | 0001 | 0001 | 0001 |
2 | 0010 | 0101 | 0011 | 0010 | 0100 |
3 | 0011 | 0110 | 0010 | 0011 | 0101 |
4 | 0100 | 0111 | 0110 | 0100 | 0111 |
5 | 0101 | 1000 | 0111 | 1011 | 1000 |
6 | 0110 | 1001 | 0101 | 1100 | 1001 |
7 | 0111 | 1010 | 0100 | 1101 | 1100 |
8 | 1000 | 1011 | 1100 | 1110 | 1101 |
9 | 1001 | 1100 | 1101 | 1111 | 1111 |
权 | 8421 | 无权 | 无权 | 2421 | 5211 |
位运算符
|符号|
&:按位与: 相对应的二进制位:都为1才为1,否则为0
|: 按位或: 相对应的二进制位:有1为1,否则为0
^:按位异或:相对应的二进制位:相同为0,不同为1
~:按位取反: 相对应的二进制位:0变1,1变0
<<:左移 : 高位丢失,低位补0
.>>:右移:
--------------正数:低位丢失,高位补0
--------------负数:低位丢失,高位补1
#include<stdio.h>
int main()
{
int a = 10, b = 0;
b = a << 2; //左移2位
printf("b=%d\n", b);//输出b=40
//a: 0000 0000 0000 0000 0000 0000 0000 1010 原码=反码=补码
//b: 0000 0000 0000 0000 0000 0000 0010 1000 补码
// 0000 0000 0000 0000 0000 0000 0010 1000 原码->40
b = a >> 2; //右移2位
printf("b=%d\n", b);//输出b=2
//a: 0000 0000 0000 0000 0000 0000 0000 1010 补码
//b: 0000 0000 0000 0000 0000 0000 0000 0010 补码
// 0000 0000 0000 0000 0000 0000 0000 0010 原码->2
return 0;
}
#include<stdio.h>
int main()
{
int a = -8, b = 0;
b = a << 3; //左移3位
printf("b=%d\n", b);//输出b=-64
//a: 1000 0000 0000 0000 0000 0000 0000 1000 原码
// 1111 1111 1111 1111 1111 1111 1111 0111 反码
// 1111 1111 1111 1111 1111 1111 1111 1000 补码
//b: 1111 1111 1111 1111 1111 1111 1100 0000 补码
// 1000 0000 0000 0000 0000 0000 0011 1111 反码
// 1000 0000 0000 0000 0000 0000 0100 0000 原码-> -64
b = a >> 3; //右移3位
printf("b=%d\n", b);//输出b=-1
//a: 1111 1111 1111 1111 1111 1111 1111 1000 补码
//b: 1111 1111 1111 1111 1111 1111 1111 1111 补码
// 1000 0000 0000 0000 0000 0000 0000 0000 反码
// 1000 0000 0000 0000 0000 0000 0000 0001 源码-> -1
return 0;
}
int a=5,b=4,c=0;
c=a&b;//输出c为4
//a 0101 补码
//b &0100 补码
//c 0100 补码=》原码
int a=5,b=4,c=0;
c=a|b;//输出c为5
//a 0101 补码
//b &0100 补码
//c 0101 补码=》原码
```c
#include<stdio.h>
int main()
{
int a = 45, b = 10, c = 0,d = 0;
c = (a + b, b + c, a + c);
d = a + b, b + c, a + c;
// 55, 10, 45
printf("c=%d,d=%d\n", c,d);
return 0;//输出结果c=45,d=55
}
```c
int a=-5,b=-4,c=0;
c=a&b;//输出c为-8
//a 1000 0000 0000 0000 0000 0000 0000 0101 源码
// 1111 1111 1111 1111 1111 1111 1111 1010 反码
// 1111 1111 1111 1111 1111 1111 1111 1011 补码1
//b 1000 0000 0000 0000 0000 0000 0000 0100 源码
// 1111 1111 1111 1111 1111 1111 1111 1011 反码
// 1111 1111 1111 1111 1111 1111 1111 1100 补码2
//--------------------------------------------------------
//c 1111 1111 1111 1111 1111 1111 1111 1000 1与2》补码3
//补码3=》原码
// 1000 0000 0000 0000 0000 0000 0000 0111 反码
// 1000 0000 0000 0000 0000 0000 0000 1000 原码》》 -8
负数补码转原码,将补码当做原码来做,继续取反加1
7.逗号运算符
可以用逗号运算符将多个表达式分隔开,整个表达式的值是最后一个表达式的值。
逗号表达式的优先级最低,低于赋值运算符
#include<stdio.h>
int main()
{
int a = 45, b = 10, c = 0,d = 0;
c = (a + b, b + c, a + c);
d = a + b, b + c, a + c;
// 55, 10, 45
printf("c=%d,d=%d\n", c,d);
return 0;//输出结果c=45,d=55
}
8.复合运算符
复合运算符有:+=,-=,*=,/=,&=,|=,^=,~=
#include<stdio.h>
int main()
{
int a = 45, b = 10, c = 0,d = 0;
a+=10; //a=a+10
a-=10; //a=a-10
a*=10; //a=a*10
a/=10; //a=a/10
a&=10; //a=a&10
return 0;
}
9.sizeof运算符
sizeof是一个运算符,而不是函数
用于:求一个类型或一个变量所占内存的大小
#include<stdio.h>
int main()
{
int a = 10;
printf("sizeof=%d\n", sizeof(int));
//sizeof=4
return 0;
}
sizeof运算符不会进行赋值操作
#include<stdio.h>
int main()
{
int a = 10;
sizeof(a = a + 1);
printf("a=%d\n", a);
return 0;//a=10
}