零基础C语言(三)
C语言运算符和表达式
运算符和表达式基本概念
- 操作数 : 对于一个运算符需要几个数字才能使用 例如:加法的操作数是2,赋值的操作数也是2
- 左值:运算符的左边 , 一般情况都是变量,不能是常量 error C2106: “=”: 左操作数必须为左值
- 右值: 运算符右边的值,(常量,变量...)
- 优先级:运算的先后顺序 a+b*(c+d);
- 结合性:左结合 右结合
赋值运算符
- =: 赋值运算符 int a=1; 赋值运算符返回的是值 int a=0,b=1; printf("%d",a=b) 返回1
- int a=b=1; 这个写法是错误的 error C2065: “b”: 未声明的标识符,但是a,b都定义之后,联等是正确的。
- 赋值运算符存在一个隐式转换,以左值的类型做转换
- ++(a+b)错误 a+b运算后是值,不能作为左值
- a=1返回值就是1
算术运算符
-
加减法: + -
-
乘法:* 必须写出来,不存在省略的写法,错误写法: a*b(c+d)
-
除法: / 自动取整 ,也就是:4/5=0 ,如果想要小数除法结果,
-
分子或者分母用一个浮点即可: 4.0/5,
-
或者直接强转一下分子或者分母 (float)4/5前两个先结合
-
分母不能为0
-
-
取余: %
- 只有整数才有,小数没有余数概念 ,错误写法3%3.0
- 余数的符号问题,符号只和被取余数有关
-
算术运算符中是 没有平方也就是幂运算 ,需要相关数学函数去描述
-
复合赋值运算符
-
+= -= /= *= ...
-
a+=1 a=a+1
-
a/=1 a=a/1
-
复合赋值运算符和右边那个有没有括号是没有关系
c *= a + b; //错误解析c=c*a+b; //c=c*(a+b);
-
条件运算符
//大于号和小于号
a>b b<a
//大于等于: >=
//小于等于: <=
//不等于:!= 要注意的是:中间不能存在空格
//等于: == 不要写成=
-
条件表达式的值只有两种,成立(1)和不成立(0)
-
计算机中的真和假: 非零值表示成立(真的),只有0 或者 NULL 或者\0 表示不成立(假的)
-
不存在连续操作: 1<a <2 : 无论a的值是什么,1<a<2 都是成立的 1<a只会得到0/1,小于2永远成立
1<a 只有两种(0,1) ,(0,1) 永远都是小于2 ,所以1<a<2永远都是成立,这个表达式的值为1
逻辑运算符
-
&&:逻辑与 理解为并且的意思 : 1<a&&a<2
-
一个汉字占两个字节,用字符串表示数组长度至少为3
a b a&&b 真1 真1 真1 真1 假0 假0 假0 真1 假0 假0 假0 假0 -
||:逻辑或理解为或者的意思: a||b 只要一个条件满足,a||b等于1
-
!: 取反 真的变成假,假的变成真,成立变成不成立,不成立变成成立
-
&&与||都存在短路现象:短路现象就是计算机偷懒
-
a&&b : a不成立的时候 ,b不会去执行
-
a||b: a的值为1 ,b不会执行
1、圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】;
2、逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++】【 --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*】【&】、长度运算符【sizeof】;
3、乘法运算符【*】、除法运算符【/】、取余运算符【%】;
4、加法运算符【+】、减法运算符【-】;
5、左移动运算符【<<】、右移动运算符【>>】;
6、关系运算符【< 】【>】【<=】【 >= 】;
7、等于运算符【==】、不等于运算符【!=】;
8、按位与运算符【&】;
9、按位异或运算符【^】;
10、按位或运算符【|】;
11、逻辑与运算符【&&】;
12、逻辑或运算符【||】;
13、条件运算符【?:】;
14、赋值运算符【=】【/=】【*=】【%=】【+=】【-=】【<<=】【>>=】【&=】【^=】【|=】;
15、逗号运算符【,】。
取反加一 减一取反都可以
括号很重要
-
位运算符
& | ~ ^按位操作 其中~注意存在补码转原码的过程
特殊运算符
-
++ --(double类型也可以)
-
内存共享 只看前置不看后置 所有的都一样
-
最后的++的操作数不管前置后置都算
-
前置:先自己改变,在去运算
-
后置:先去运算,在改变自己
int a = 1; //a++ 解析 a=a+1 //a-- 解析 a=a-1 int result = a++; //后置 先做:result=a 再做a=a+1 //result=1 a=2 result = ++a; //前置 先做a=a+1 再做result=a; //resuslt=3 a=3 int b = 3; result = b--; //result=3 b=2 result = --b;
-
-
sizeof(在编译期完成运算,其中进行的赋值运算均无效)
//sizeof:运算符
result = sizeof(int); //4byte result=4
result = sizeof(result); //result=4
result=sizeof(char); //1
result=sizeof(double); //8 -
?:
int a = 1;
int b = 2;
int max = (a > b ? a : b); //求最大值
//(a > b ? a : b)
//a>b 成立 (a > b ? a : b)等于a
//a>b 不成立 (a > b ? a : b)等于b
//因为1>2不成立 (a > b ? a : b)的值就是b -
,
int a = 1;
int b = 2;
int max = (a > b ? a : b); //求最大值
//(a > b ? a : b)
//a>b 成立 (a > b ? a : b)等于a
//a>b 不成立 (a > b ? a : b)等于b
//因为1>2不成立 (a > b ? a : b)的值就是b
//max=b; max=2
//逗号表达式
int d = 1;
int c = 1;
result = (c=a + b, d=b + c, c + d); //result=c+d
//逗号表达式的有效值是最后边的表达式,但是其他表示也会执行
写代码时候,不知道优先级没关系,多用括号是没有错的。
a+b<3||b+c<4
(a+b<3)||(b+c<4);
-
内存共享
a=1
a++ + a++ + a++ + a++
只看前置不看后置,所有部分都是一样的值
上式等价于a+a+a+a=4
运行后a=5
b=2
b++ * ++b * b++ * ++b * b++
b* b *b * b * b b等于4
运行后b=7

浙公网安备 33010602011771号