再续前缘!对于操作符篇章,我们前面基本都已经涉及过,讲解时重在回顾,不多重复。
目录
1.单目操作符
1.1 逻辑反操作(!)
对逻辑结果取反,(!真)为假;(!假)为 真
1.2 取地址操作(&)
1.3 sizeof
sizeof用来计算开辟空间的大小(单位是字节),属于单目操作符,而不是函数。
1.31sizeof的使用
计算类型大小:需要+()
计算变量大小:可以省略()
而函数的调用必须要加()用于接收操作数(函数本身就是第一个操作数,要调用就必须+())
1.32 sizeof返回值
sizeof的返回值是一个无符号整型(unsigned int/size_t)
如下:(隐式类型转换会在后面讲到,了解过的可以看一下,小白可过)
1.33 sizeof与数组
数组的名字在绝大多数情况下都代表着数组首元素的地址,但有两处特殊的情况中代表的是整个数组。
第一种:(取地址)&+(数组名)arr
第二种:sizeof(arr)--sizeof中单独出现arr,代表计算的是整个数组开辟空间的大小。
1.34 sizeof与strlen
sizeof是操作符,也是关键字,用来计算开辟空间的大小。
strlen是一个字符串操作函数,头文件是 string.h,用来计算字符串的长度,遇到' \0 '停止,且' \0'长度不计。
#include<stdio.h>
//sizeof与strlen
int main()
{
char arr1[] = "abc";'a','b','c','\0'
char arr2[] = { 'a','b','c' };'a','b','c'......
printf("%d\n", sizeof(arr1));//'a','b','c','\0'
printf("%d\n", sizeof(arr2));//'a','b','c'
printf("%d\n", strlen(arr1));//'a','b','c'('\0'长度不计)
printf("%d\n", strlen(arr2));'a','b','c'......
return 0;
//输出结果是 4 3 3 随机值
//(本次随机值为15,而15其实是一个随机数)
}
1.4 按位取反(~)
1.5 自增自减(++、--)
1.51前置(++a 、 --a)
1.52后置(a-- 、a++)
1.6 解引用操作符(*)
2. 条件操作符(? :)
第一个表达式?满足(若第一个表达式逻辑结果为真)执行:不满足(若第一个表达式逻辑结果为假)执行
条件操作符也是惟一的三目操作符
例1:求两个数的最大最小值
例2:求三个数的最大值
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//条件操作符的使用:求三个数的最大值
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
int mid = a > b ? a : b;
int max = mid > c ? mid : c;
printf("MAX = %d\n", max);
}
例3:三目操作符的嵌套使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//三目操作符的嵌套使用
//如果分数在90分以上(包括90),成绩为'A';
//如果分数在60分以上(包括60),90分一下,成绩为'B';
//如果分数在60分以上,成绩为'C';
int main()
{
int score;
char grade;
printf("请输入分数>");
scanf("%d", &score);
grade = score >= 90 ? 'A' : score >= 60 ? 'B' : 'C';
printf("%c", grade);
return 0;
}
3.逗号表达式
即用逗号隔开的表达式。每个逗号一个表达式。
如 表达式1,表达式2,3,4,5,6;执行结果从左到右依次执行,但整个大表达式的结果是最后一个小表达式的结果,即最后一个逗号后的表达式结果。
例1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//逗号表达式
int main()
{
int a = 4;
int b = 6;
int c = (a + 2, b, b * a, a + b);
//从左到右:6 6 24 10
printf("%d %d %d\n", a, b, c);
//注意逗号表达式的优先级是最低的,所以一定要加括号,避免优先级错误。
//若此处不加(),则就会直接把a+2值赋给c,甚至出现语法错误。
return 0;
}
例2
4.下标引用和函数调用
4.1 下标引用操作符(‘ [ ] ’)
数组名+索引值(下标),用于数组的下标访问。
4.2函数调用操作符( ‘()’ )
函数名+(),‘()’内接受操作数,第一个操作数是函数名,剩下的操作数就是传递给函数的实参。
5.结构体访问操作符
5.1. (点)‘ . ’ 操作符
例1:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//逗号表达式
struct student
{
char name[20];
int grade;
char gender[10];
};
int main()
{
struct student stu = { {"花骨朵"},{50},{"男"} };
printf("%s\n%d\n%s\n", stu.name, stu.grade, stu.gender);
return 0;
}
例2
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
//结构体成员访问操作符(.)的使用
struct student
{
char name[20];
int grade;
char* gender;
};
int main()
{
struct student stu;
struct student* ps = &stu;
//stu.name = "花骨朵" ——对字符数组进行赋值时,不可以直接使用'.'操作符
//可通过使用strcpy字符串操作函数对数组进行赋值。
//stu.gender=""花骨朵"——可以对字符指针使用'.'操作符
strcpy(stu.name, "小花骨朵");
stu.gender = "Big花骨朵";
stu.grade = 80;
printf("%s\n%d\n%s\n", stu.name, stu.grade, stu.gender);
return 0;
}
5.2. ‘ -> ’(结构体指针) 操作符
例:
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
//结构体访问操作符的使用
struct student
{
char name[20];
int grade;
char* gender;
};
int main()
{
struct student stu;
struct student* ps = (struct student*)&stu;
//ps->name="YOU!"——结构体指针访问操作也不可对字符数组进行赋值
strcpy(ps->name, "会飞的水母");
ps->grade = 50;
ps->gender = "会飞的乌龟";
printf("%s\n%d\n%s\n", ps->name, ps->grade, ps->gender);
return 0;
}
因大多数知识均在前面涉及过,所以本篇中具体讲解较少,实例较多,若有不甚解之,可梳理一下自己的已学知识点,也可在评论区讨论哦。