目录
前言
在前面一篇博客中,我们讲了大多数操作符,今天我们来讲一讲剩下的操作符。
一、结构成员访问操作符
1.1 结构体
在讲结构成员访问操作符前,我们来了解一下什么是结构体。
C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类 型还是不够的,程序员还可以创造自己想要的类型,这就是结构体类型。
结构体的声明
struct tag
{
member-list;//结构体变量
}variable-list;//定义结构体变量
其中结构体内部的变量为结构体成员,结构的每个成员可以是不同类型的变量,如:
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}; //分号不能丢
1.2 结构体变量的定义和初始化
结构体变量的定义可以有两种方式
直接在结构体后定义
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
在全局中定义
struct Point p2; //定义结构体变量p2
结构体的初始化
struct Point p3 = {10, 20};
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s1 = {"zhangsan", 20};//初始化
struct Stu s2 = {.age=20, .name="lisi"};//指定顺序初始化
结构体里还可以嵌套初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
1.3 结构体的访问
在初始化s2时,我们使用到了结构成员访问操作符 ,可以直接访问结构体成员
比如说下面这段代码
#include <stdio.h>
struct Point
{
int x;
int y;
}p = {1,2};
int main()
{
printf("x: %d y: %d\n", p.x, p.y);
return 0;
}
通过结构成员访问操作符,我们可以直接访问到了结构体Point中的x,y。
使用方式:结构体变量.成员名
除了直接访问,我们也可以通过指针间接访问结构体
#include <stdio.h>
struct Point
{
int x;
int y;
};
int main()
{
struct Point p = {3, 4};
struct Point *ptr = &p;
ptr->x = 10;
ptr->y = 20;
printf("x = %d y = %d\n", ptr->x, ptr->y);
return 0;
}
二、操作符的属性
1.优先级
优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是 不⼀样的
4+3*5
我们都知道乘法的优先级比加法高,所以我们先算3*5,再把结果与4相加,这就是优先级的作用。
下面是常见的操作符的优先级(按照优先级从⾼到低排列)
2.结合性
5*6/2
乘法的优先级和除法一样,这时候我们就要看结合性了,它们都是左结合运算符,所以从左到右执行,先计算 5 * 6 , 再计算 / 2 。
关于C语言中的优先级和结合性我们可以参考下面这个网站:
三、表达式求值
1 整型提升
//负数的整形提升
char c1 = -1;
变量c1的⼆进制位(补码)中只有8个⽐特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的⼆进制位(补码)中只有8个⽐特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,⾼位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//⽆符号整形提升,⾼位补0
2.算术转换
long double
double
float
unsigned long int
long int
unsigned int
int
四、问题表达式解析
学习了操作符的属性和表达式求值,接下来我们来看看几个问题表达式:
1.表达式1
//表达式的求值部分由操作符的优先级决定。
//表达式1
a*b + c*d + e*f
//表达式2
c + --c;
//表达式3
int main()
{
int i = 10;
i = i-- - --i * ( i = -3 ) * i++ + ++i;
printf("i = %d\n", i);
return 0;
}
上面代码再不同表达式中有不同的结果
4.表达式4
#include <sdtio.h>
int fun()
{
static int count = 1;
return ++count;
}
int main()
{
int answer;
answer = fun() - fun() * fun();
printf( "%d\n", answer);//输出多少?
return 0;
}
有些同学可能还没有发现其中的问题
//表达式5
#include <stdio.h>
int main()
{
int i = 1;
int ret = (++i) + (++i) + (++i);
printf("%d\n", ret);
printf("%d\n", i);
return 0;
}
总结
本章文章讲了前面剩下的结构体访问操作符,同时介绍了操作符的属性,和一些问题表达式的解析。希望对你有所帮助。