5. 赋值操作符
赋值操作用于给变量初始化或者改变变量的值。
int a = 10; //初始化 a = 20; //赋值
赋值操作也能写作复合形式:
int a = a+1; 写做int a += 1;
int a = a>>1;写做 int a >>= 1;
……
6. 单目操作符
概念:只有一个操作数的操作符称之为单目操作符。
主要的单目操作符:逻辑反(!),取地址(&),操作符的类型长度(sizeof),强制类型转换(一对小括号)……
6.1 sizeof操作符
#include <stdio.h> int main() { int a = -10; int *p = 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; } //关于sizeof其实我们之前已经见过了,可以求变量(类型)所占空间的大小。
6.2 sizeof和数组
#include <stdio.h> void test1(int arr[]) { printf("%d\n", sizeof(arr));//(2) 打印4/8 } void test2(char ch[]) { printf("%d\n", sizeof(ch));//(4) 打印4/8 } int main() { int arr[10] = {0}; char ch[10] = {0}; printf("%d\n", sizeof(arr));//(1) 打印40 printf("%d\n", sizeof(ch));//(3) 打印10 test1(arr); test2(ch); return 0; }
注意:
- 当sizeof的括号内是数组名是算出的是整个数组的字节大小。
- 数组传参传递的是数组首元素的地址。所以在test1函数和test2函数中计算的是指针变量的大小,而指针变量的大小在32位平台下占用的空间是4个字节,在64位平台占用的是8个字节。
- sizeof后的括号可以去掉就说明sizeof并不是函数。因为函数的调用必须要括号。
- 在数组中去掉名字,剩下的就是数组的类型。例如:数组int arr[10];的类型就是 int [10]
当scanf读取失败时,返回的时EOF,值是-1,-1的补码全为1,可以通过以下的代码实现多组输入。
int main() { int a = 0; //假设返回EOF,其二进制序列全是1,取反之后全是0,条件为假,退出循环。 while(~scanf("%d",&a)) { printf("%d ",a); } return 0; }
7. 关系操作符
关系操作符较为简单。
8.逻辑操作符
主要有两个 && (与)和 ||(或)。
注意:这里要与按位与和按位或做区分。
1&2----->0 1&&2---->1 1|2----->3 1||2---->1
先看一道题:
int main() { int i = 0,a=0,b=2,c =3,d=4; i = a++ && ++b && d++; //i = a++||++b||d++; printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d); return 0; }
执行结果:
分析:代码第4行a++ 表达式的结果是0,也就是假,对于逻辑与来讲,只要遇到执行结果为假的表达式,该语句之后的代码则不会再执行了。
逻辑与和逻辑或的特点:逻辑与和逻辑或会发生“短路现象”。
对于逻辑与来讲,倘若遇到执行结果为假的表达式,则该语句之后的表达式就不会再继续执行了。
对于逻辑或来讲,倘若遇到执行结果为真的表达式,则该语句之后的表达式就不会再继续执行了。
9. 条件操作符
exp1 ? exp2 : exp3
条件操作符与 if else语句可以相互转换。
Q3:
if (a > 5) b = 3; else b = -3; 转换成条件表达式,是什么样? // b = (a>5)?3:-3;
10. 完结
本章的内容就到这里啦,若有不足,欢迎评论区指正,最后,希望大佬们多多三连吧,下期见!