【C语言】8.C语言操作符详解(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
  1. 先算a>b,这步没什么影响。因为没有赋值,只是单纯的比较了一下。这个表达式的结果是0。
  2. 然后算a = b + 10,a=2+10=12。这个表达式的结果是12。
  3. 然后算a,这步没什么影响,因为没有赋值。这个表达式的结果是12。
  4. 然后算b = a + 1,b=12+1=13。这个表达式的结果是13。
  5. 上面一步得到的13,是逗号表达式的值,所以c=13。
  6. 打印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\n
	printf("%d\n",100);//操作数是printf和%d\n和100
	int 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;
}

现在看不懂没事,后面讲指针的时候会讲到。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值