1.表达式
在c语言中表达式是用 运算符连接操作数 并且表达某种意思的式子
既然是表达是就会有一个值
3+4 a+b
2.运算符:
几目运算符?
a)单目运算符:操作数只有一个!
b)双目运算符:操作数只有二个
c)三目运算符:操作数只有三个 ? :
性质:
优先级
结合性:从左到右,从右到左
int a =2;
int b=3;
int c;
c=b=a;
2.1算数运算符:从左至右
1.双目运算符
* / %
+ -
ps:
1)3+2*5 <====>13
2)3/2 整数除整数只能为整数
double a=3/2 1.000000
int a=3/2 1
int a=3/2*1.0 1
如果想要结果为小数,在分子分母后面*1.0 并且赋值的类型必须为float double
自动向高精度靠拢
3)%左右两边只能为整数 3%2 1 3%-2 a%b=a-(a/b)*b 对取余存在负数,看被除数
4)4/0 4%0 //error 浮点数例外 (核心已转储)
2.单目运算符 ++ --
表达式的值 i的值
i++ i i=i+1
++i i+1 i=i+1
i-- i i=i-1
--i i-1 i=i-1
2.2关系运算符:判断2个操作数的关系 从左到右
> >= < <= == !=
关系表达式的值:
1(表达式成立) 0(关系不成立)
ps:5>4>3 =====>(5>4) ==> 1>3 ===>0
2.3逻辑运算符:表达某个式子逻辑
表达式的值:
非0 真(1)
0 假(0)
! 非 单目
&& 与 双目 从左至右 并且:有0就是0
1&&0 0
1&&1 1
0&&0 0
0&&1 0
|| 或 双目 从左至右 或者:有1就是1
ex.
a=4 b=5
!a 0
4&&5 1
!0 1
4&&5&&0 0
惰性运算:
并不是所有逻辑符后面的表达式都会被执行
1)a&&b&&c
如果判断a是假的,那么b和c都不会被执行
2)a||b||b
如果判断a是真的,那么b和c都不会被执行
ex.int a=1;
a&&a--&&a-- 表达式值是多少? 0
a||a-- a的值是多少? 1
ex.判断某年是否为闰年
1)可以被400整除
2)可以被4整除 并且不能被100整除
1.1)||2)
2.a%400==0
3.a%4==0&&a%100!=0
2.4位运算符
~ | & << >> ^
a).&(按位与)
1&1=1
1&0=0
0&1=0
0&0=0
3&5 表达式的值 011 & 101 001
6&10 表达式的值 (用补码计算)
用途:
1)把某些位置0
ex.int flag ;把flag低4位置0 flag=flag&0xfffffff0
2)保留数中某些位
3)取指定位
b). |(按位或)
1|1=1
1|0=1
0|1=1
0|0=0
用途:把某些位置1
ex.int flag ;把flag低4位置 flag=flag|0xf
c) ^(按位异或)
1^1=0
1^0=1
0^1=1
0^0=0(同0异1)
用途:1)把一个数清0
ex0.5^5 0
ex1.3^5 值011 ^101 结果:110 6
ex2.不用临时变量交换2个数的值
a=a^b //a1 b1
b=a^b; //b=a1^0;
a=a^b;// a=0^b1
2)可以把原来的数取反
x^1=~x
x^0=x
d) <<(左移运算) 双目运算符
规则:高位舍弃 低位补0
ex.(2<<4) <=====> 2*2(4)
int a=1;
int b=3;
a<<b 表达式的值:8 a的值:1
e) >>(右移运算)
规则:
无符号数:低位右移舍弃 高位补0
有符号数:低位右移舍弃 高位补符号位
x>>n;
2>>1 表达式的值:1
如果为正数,相当于除以2的n次方
f) ~(按位取反) 单目运算
规则:0 - 1
1 - 0
ex.把flag的第23位置0
flag=flag&( ~(1<<22));
把flag的第23位置1
flag=flag|( (1<<22) );
2.5
赋值运算符:双目运算符(从右向左)
3=4;
赋值号的左边必须为地址
int a;
a=4error
a+=3; a=a+3
a*=3; a=a*3
a-=3; a=a-3;
a/=3; a=a/3;
int b=3,c=4;
a=b=c; //a=4,b=4
2.6
条件运算符
表达式 ?a:b
规则:如果表达式为真,取a,否则取b
2.7
逗号运算符(双目运算符)从左至右
b=(a=表达式1,表达2,....表达式n);
1.先算表达式1赋值给a
2.算表达值2
3.算表达式n赋值给b
2.8
指针运算符(* &)
2.9
字节运算符
求数据类型所占的字节数大小
sizeof(0.8)
sizeof(int)
2.10 分量运算符(. ->)
struct student
{
char name[10];
char sex;//成员变量
int no;
};
struct student a;
printf("%d",a.no);
struct student *a;
printf("%d",a->no);
2.11
强制类型转换运算符
float a=3.6;
int b=(int)a+4;
优先级:
!>算数运算符>关系运算符>&&>||>条件运算符>赋值>逗号运算符
记不清用括号