5. 赋值操作符
赋值操作符,它可以让你更改你之前不满意的值,也就是你可以给自己重新赋值
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值
赋值操作符是可以连续赋值的,如
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
但是这样代码的可读性就不太好,可以改成
x = y+1;
a = x;
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
int x = 10;
x = x+10;
x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
6.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
-- -- -- -- -- -- -- -- -- --
使用sizeof去计算大小
#include <stdio.h>
int main()
{
int a = -10;
int* p = NULL;//不初始化就置为空指针(NULL)
printf("%d\n", !2);
printf("%d\n", !0);
a = -a;
p = &a;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);
//printf("%d\n", sizeof int);//这个写法是错的
return 0;
}
运行结果:
0
1
4
4
4
-- -- -- -- -- -- -- -- -- --
sizeof 和 数组
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(ch));
test1(arr);
test2(ch);
return 0;
}
运行结果:
40
10
8
8①
-- -- -- -- -- -- -- -- -- --
++和--运算符
前置++和--
int main()
{
int a = 10;
int x = ++a;
//先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11
int y = --a;
//先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;
return 0;
}
-- -- -- -- -- --
后置++和--
int main()
{
int a = 10;
int x = a++;
//先对a先使用,再增加,这样x的值是10;之后a变成11;
int y = a--;
//先对a先使用,再自减,这样y的值是11;之后a变成10;
return 0;
}
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
7. 关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
要注意一个等号=是赋值,两个等号才是相等==
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
8. 逻辑操作符
&& 逻辑与
|| 逻辑或
区分逻辑与和按位与、区分逻辑或和按位或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
来一道例题
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
运行结果:
a = 1
b = 2
c = 3
d = 4
为什么只有a++了一次而其他的没变,是因为a++是后置++,先使用再++。首先a=0,逻辑判断为假,只要有一个假后面的都不判断了,然后a++变成1,而后面的b和d都是不判断的
同理,那下面代码结构是什么呢
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
运行结果:②
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
9. 条件操作符
exp1 ? exp2 : exp3
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = a > b ? a : b;
printf("%d\n", c);
return 0;
}
运行结果:2
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10. 逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式
printf("%d\n", c);
return 0;
}
运行结果:13
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
附
①作者的编译器当前是64为平台的,所以指针大小是8,如果算出结果为4也是正确的(32位平台)
![](https://i-blog.csdnimg.cn/blog_migrate/07b17bdcf70cc521a0e14f4353b63ca2.png)
②
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/8dc980076ffaf402d4e168c0a1eec90f.png)