操作符和表达式的分类:
算数操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用、函数调用和结构成员
1.算数操作符:+ - * / %
/
eg:
int a=1;
int b=2;
int c=a/b;
得到c的值为0。整形除整形,无论被除数a是正数还是负数,按绝对值来看,向下取整。
eg1:
int a=9.0; //a是int型
int b=10;
double c=a/b;
eg2:
double a=9.0; //a是double型
int b=10;
double c=a/b;
eg1中c的值为0.000000,eg2中c的值为0.900000
进行 / 操作时,如果把0作为除数:编译可能通过,但运行一定出错.
进行 % 操作时,int n=10%0;(错误) ,% 操作不能把0作为除数.
% 操作符不能用于浮点数,两个操作数必须为整数,返回的是整除之后的余数.
2.移位操作符:<< 左移操作符 , >>右移操作符
eg:
int x=10;
二进制:0000 0000 0000 0000 0000 0000 0000 1010
x<<1: 000 0000 0000 0000 0000 0000 0000 10100
x>>1: 00000 0000 0000 0000 0000 00000000 101
左移一位等价于乘2
右移一位等价于除2
右移有两种:
逻辑右移:左侧直接补0
算数右移:左侧补符号位
对于移位运算符,不要移动负数位,这个标准是未定义的。同样,也不要移动过大位数,这样可能会超过这个数本身的位数,这种操作同样是未定义行为。
3.位操作符:
& 按位与
| 按位或
^ 按位异或
eg:
int a=0x1; //0001
int b=0x2; //0010
a & b =0x0 //0000
a | b =0x3 //0011
a ^ b =0x3 //0011
eg:
int x=0xa;
x|(0x1<<10); //给x的第10位设为1
x&~(0x1<<10);//给x的第10位设为0
eg: 不创建临时变量,实现两个数的交换
int a=3;
int b=5;
a= a^b;
b= a^b;
a= a^b;
eg: 求一个整数二进制下1的个数
int count=0;
for(inti=0;i<32;++i){
if(n&(1<<i)){
count++; // count为1的个数
}
}
4.赋值操作符:给已有的初始化过的变量进行重新赋值
连续赋值:
eg:
int a=0;
int b=0;
a=b=10;
5.复合赋值符:+=,-=,*=,/=, %= ,>>= ,<<= ,&= ,|= ,^=
6.单目操作符:
! 逻辑反操作
1为真,0为假 0逻辑取反为1,非0取反为0.
–负值 ,+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
sizeof 可以计算一个数组的元素个数:sizeof(数组名)/sizeof(数组名[0])
~ 对一个数的二进制按位取反
- - 前置、后置- -
++ 前置、后置++
间接访问操作符(解引用操作符)
(类型) 强制类型转换***
7.关系操作符:> >= < <= != ==
8.逻辑操作符: && 逻辑与 || 逻辑或
eg:
int i=0,a=0,b=2,c=3,d=4;
i= a++ && ++b && c++ && d++; //a=1,b=2,c=3,d=4
//进行&&运算时,如果左侧表达式为0,那么右侧表达式不会求值
i = a++||++b||c++||d++; //a=1,b=3,c=3,d=4
//进行||运算时,如果左侧表达式为1,那么右侧表达式不会求值
9.条件操作符:exp ? exp2 : exp3
eg: 求两个值中的较大值
int x=5;
int y=3;
return x > y ? x : y;
10.逗号表达式: 就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
exp1,exp2, exp3,…expn
11.下标引用、函数调用和结构成员:
[ ]
下标引用操作符
操作数:一个数组名+一个索引值
( )
函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
访问一个结构的成员
.结构体.成员名
->结构体指针->成员名
eg:
struct Student {
char name[10];
int id;
}
int main() {
struct Student stu={“xiaohua”,2019 };
struct Student* p = &stu;
p->name; //以下三行效果相同,访问成员
(*p).name;
Stu.name;
return 0;
}
12.表达式求值:
隐式类型转化:
eg:
char a=10;
int b=20;
a=b; //b隐式转换成char
eg:
unsigned char a=0xff;
unsigned char b=(a<<1)>>1;//移位过程中,触发了隐式类型转换,会把char转成int
如果使用char/short进行算术运算或者移位运算或者位运算,都会触发隐式类型转换,转换成int.(整形提升,是隐式类型转换的一种)
算数转换:如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。
eg:
int a=10;
double b=20;
int c=a+b;//规则是都先转成double,得到的结果是一个double,再转回int.