文章目录
- 6.单⽬操作符
- 7.逗号表达式
- 8.下标访问[]、函数调⽤()
- 8.1 [ ] 下标引⽤操作符
- 8.2 函数调⽤操作符
- 9.结构成员访问操作符
- 9.1 结构体
- 9.1.1 结构的声明
- 9.1.2 结构体变量的定义和初始化
- 9.2 结构成员访问操作符
- 9.2.1 结构体成员的直接访问
- 9.2.2 结构体成员的间接访问
6.单⽬操作符
单目操作符有这些:
!、++、--、&、*、+、-、~ 、sizeof、(类型)
单目操作符的特点是只有一个操作数,在单目操作符中只有 &
和 *
没有介绍,这2个操作符,我放在后面指针那一节介绍。
需要注意
&作为双目操作符的时候是按位与,作为单目操作符的时候是取地址。
a & b
—>按位与
&a
—>取地址
7.逗号表达式
exp1,exp2,exp3,...expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
例1:
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
- 先算
a>b
,这步没什么影响。因为没有赋值,只是单纯的比较了一下。这个表达式的结果是0。 - 然后算
a = b + 10
,a=2+10=12。这个表达式的结果是12。 - 然后算
a
,这步没什么影响,因为没有赋值。这个表达式的结果是12。 - 然后算
b = a + 1
,b=12+1=13。这个表达式的结果是13。 - 上面一步得到的13,是逗号表达式的值,所以c=13。
- 打印c的值,输出13。
逗号表达式一定要从左向右算,因为前面的运算可能会影响后面。
我们接着来看下面一段代码:
int main() {int a = 0;a = get_val();count_val(a);while (a > 0) {a = get_val();count_val(a);}return 0;
}
这段代码我们可以看到3,4行和6,7行一样,看起来比较麻烦。
我们可以优化一下:
int main() {int a = 0;while (a = get_val(),count_val(a), a > 0) {}return 0;
}
实际上两个代码的功能一样,但是看上去逻辑清晰了不少。
8.下标访问[]、函数调⽤()
8.1 [ ] 下标引⽤操作符
int main() {int arr[10] = { 1,2,3,4,5 };int m = arr[4];//数组中下标是4的元素//[ ]:下标引用操作符;操作数是arr和4;这个4我们叫做数组下标或索引//3+5:+是操作符;3和5是操作数printf("%d\n", m);return 0;
}
8.2 函数调⽤操作符
int Add(int x, int y) {return x + y;
}int main() {printf("hehe\n");//这里的():就是函数调用操作符;操作数是printf和hehe\nprintf("%d\n",100);//操作数是printf和%d\n和100int ret = Add(3, 5);//操作数是Add,3,5//函数调用操作符最少有几个操作数?//1个,在一个函数不去传参的时候,就只有1个操作数,也就是函数名return 0;
}
9.结构成员访问操作符
9.1 结构体
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚至是其他结构体。
9.1.1 结构的声明
struct tag
{member-list;//成员列表,这个里面至少要有1个成员
}variable-list;//变量列表
9.1.2 结构体变量的定义和初始化
创建结构体变量:
//学生类型
struct Student {//成员变量char name[20];int age;float score;
};struct Student s3;//全局变量int main() {int a;struct Student s1;//局部变量//这个s1就是用Student这个学生类型创建的对象。struct Student s2;return 0;
}
//学生类型
struct Student {//成员变量char name[20];int age;float score;
}s4, s5, s6;//全局变量
//这里面的s4, s5 ,s6和上面的s3一个意思,就是写法不同
初始化结构体变量:
//学生类型
struct Student {//成员变量char name[20];int age;float score;
}s4 = { "小李",22,22.2 }, s5, s6;//全局变量struct Student s3 = { "王五",25,88.8 };//全局变量int main() {int a;struct Student s1 = { "翠花",20,98.0 };//局部变量struct Student s2 = { "旺财",18,69.8 };return 0;
}
结构体变量的嵌套定义和初始化:
struct Point {int x;int y;
};struct S {char ch;struct Point p;int arr[10];double d;
};int main() {int a;struct Point p = { 10,20 };struct S s = { 'a',{4,5},{1,2,3,4,5,6,7},3.14 };return 0;
}
9.2 结构成员访问操作符
9.2.1 结构体成员的直接访问
结构体变量.结构体成员名
->
这个是依赖指针的,会在后面讲指针的章节详细讲到。
struct Point {int x;int y;
};struct S {char ch;struct Point p;int arr[10];double d;
};int main() {int a;struct Point p = { 10,20 };struct S s = { 'a',{4,5},{1,2,3,4,5,6,7},3.14 };printf("%c\n", s.ch);//访问了结构体变量s里面的ch元素printf("坐标是:%d %d\n", s.p.x, s.p.y);printf("%d\n", s.arr[0]);printf("%lf\n", s.d);return 0;
}
打印:
a
坐标是:4 5
1
3.140000
9.2.2 结构体成员的间接访问
有时候我们得到的不是一个结构体变量,而是得到了一个指向结构体的指针。
结构体指针->成员名
#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;
}
现在看不懂没事,后面讲指针的时候会讲到。